[英]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個值( 51
, 56.000000
,和48
)是錯誤的。
我用於gpsdata
的數據可以在這里找到,並通過data=load("~/gpsdata.mat");
隨后是gpsdata=data.gpsdata;
。
正如@ rahnema1指出的,我經過一個string
而不是int
通過做printf("%d", num2str(idx))
所以倍頻程中打印的ASCII碼"380"
,這正好是51
, 56
, 48
。
進行printf("%d", idx)
產生預期的行為。
感謝您抓住這一點!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.