簡體   English   中英

Octave for循環中意外的printf()行為

[英]Unexpected printf() behavior in Octave for-loop

我最近剛從MATLAB切換到Octave,因為許可證用完了,我想在續約前先試一下,所以現在無法檢查MATLAB中的行為。 我不確定在這里是否犯了一個嚴重的錯誤,但是我對Octave中的for循環感到有些頭疼。

該循環應該在我先前使用dlmread()讀取的csv文件的某一列(在本例中為第5列)的值中找到第一個“大”變化( 0.08 dlmread() ,然后將索引返回給我的第一個變化,因此我可以在發生第一個大變化之前丟棄所有數據,以進行進一步的計算。

在嘗試解決這一問題時,我記得一個人應該避免在MATLAB中使用for循環(可能也要避免使用Octave),並且我設法通過做來獲得了想要的結果

idx = find(diff(gpsdata(:,5)) > 0.08, 1);

這顯然更干凈(也許也更快),我會堅持下去; 但是,我仍然想知道為什么for循環顯示這種奇怪的行為。

我的代碼中是否有錯誤,還是僅是為什么在Octave / MATLAB中應避免for循環的標志? 在Octave / MATLAB中將for循環並行化了,這就是為什么會這樣嗎?

for (jj = 1:(size(gpsdata, 1) - 1))
  if (gpsdata(jj, 5) + 0.08 < (gpsdata(jj+1, 5)))
    idx = jj;
    disp(["jj=" num2str(jj) ", idx=" num2str(idx)]);
    printf("Found index %d, at %f s real time\n", num2str(idx), gpsdata(idx, 2));
    break;
  end
end

實際輸出:

jj=380, idx=380
Found index 51, at 56.000000 s real time
Found index 48, at 19.770000 s real time

預期產量:

jj=380, idx=380
Found index 380, at 19.770000 s real time

disp()調用產生了正確的輸出,而printf()在返回錯誤值的基礎上以某種方式執行了兩次,只有四個參數中的第四個是正確的( 19.770000是這里的預期輸出); 其他3個值( 5156.000000 ,和48 )是錯誤的。

再現數據

我用於gpsdata的數據可以在這里找到,並通過data=load("~/gpsdata.mat"); 隨后是gpsdata=data.gpsdata;

正如@ rahnema1指出的,我經過一個string而不是int通過做printf("%d", num2str(idx))所以倍頻程中打印的ASCII碼"380" ,這正好是515648

進行printf("%d", idx)產生預期的行為。

感謝您抓住這一點!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM