Я только недавно перешел с MATLAB на Octave, потому что у меня закончилась лицензия, и я хотел дать ей шанс перед обновлением, поэтому я не могу проверить поведение в MATLAB прямо сейчас. Я не уверен, что делаю здесь серьезную ошибку, но у меня немного болит голова из-за цикла for в Octave.
Цикл должен был найти первое «большое» изменение (0.08
) в значениях одного из столбцов (в данном случае столбца 5
) csv-файла I ранее прочитайте dlmread()
, а затем верните мне индекс первого изменения, чтобы я мог отбросить все данные до того, как произойдет это первое большое изменение для моих дальнейших вычислений.
Пытаясь решить эту проблему, я вспомнил, что следует избегать циклов for в MATLAB (и, вероятно, также и в Octave), и мне удалось получить желаемый результат, просто выполнив
idx = find(diff(gpsdata(:,5)) > 0.08, 1);
, который, очевидно, намного чище (и, вероятно, быстрее?), И я буду придерживаться его; однако мне все еще интересно, почему цикл for показывает это странное поведение.
Есть ли ошибка в моем коде, или это просто знак того, почему в Octave / MATLAB следует избегать циклов for? Параллельно ли for-циклы в Octave / MATLAB, вот почему это происходит?
код
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 значения (51
, 56.000000
и 48
) неверны.
Данные для воспроизведения
Данные, которые я использую для gpsdata
, могут быть найдены здесь и считаны с data=load("~/gpsdata.mat");
, за которым следует gpsdata=data.gpsdata;
.