Неожиданное поведение printf () в цикле for Octave - PullRequest
0 голосов
/ 09 января 2019

Я только недавно перешел с 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;.

1 Ответ

0 голосов
/ 09 января 2019

Как указал @ rahnema1, я передавал string вместо int, выполняя printf("%d", num2str(idx)), поэтому Octave печатал коды ascii для "380", которые, как оказалось, 51, 56, 48.

Выполнение printf("%d", idx) дает ожидаемое поведение.

Спасибо, что поймали это!

...