Octave for循环中意外的printf()行为

时间:2019-01-09 04:03:00

标签: matlab for-loop printf octave race-condition

我最近刚从MATLAB切换到Octave,因为我的许可证用完了,我想在续约前先试一试,所以现在无法检查MATLAB中的行为。我不确定在这里是否犯了一个严重错误,但是我对Octave中的for循环感到头疼。

该循环应该在我之前的csv-file的其中一列(在这种情况下为列0.08)的值中找到第一个“大”变化(5)用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()在返回错误值的基础上以某种方式执行了两次,只有4个参数中的第四个是正确的(19.770000是这里的预期输出);其他3个值(5156.00000048)是错误的。

要复制的数据

可以在here处找到我用于gpsdata的数据,并依次输入data=load("~/gpsdata.mat");gpsdata=data.gpsdata;来读取。

1 个答案:

答案 0 :(得分:0)

正如@ rahnema1指出的那样,我通过执行string传递了int而不是printf("%d", num2str(idx)),所以Octave为"380"打印了ascii代码成为515648

执行printf("%d", idx)会产生预期的行为。

感谢您的光临!