Цикл for не повторяется

#matlab #for-loop

#matlab #цикл for

Вопрос:

В MATLAB следующий for цикл:

 for i = [1:100]' 
    %'// Do something, such as disp(i)
end
  

по-видимому, на самом деле не реализуется итерацией, а i становится матрицей [1 2 3 … 100], и «цикл» выполняется только один раз для этой матрицы i . Вы можете проверить это, напечатав значение i или другую информацию отслеживания. Через цикл выполняется только один проход.

Можно ли заставить MATLAB выполнять подлинный цикл? Причина, по которой я спрашиваю, заключается в том, что приведенный выше подход подходит для многих случаев, но гораздо более болезненный, когда у вас есть вложенные циклы, которые необходимо запустить.

Пример:
следующий код не будет делать то, что вы ожидаете, если вы думали, что получаете фактическую итерацию по циклу:

 for i = outlier
    data(i) = median(data(i-100:i 100))
end
  

Можно было бы ожидать, что при каждом индексе выброса данные (i) будут заменены медианой данных от i-100 до i 100, но это не так. Фактически, медиана возвращает единственное значение, вычисленное для конгломерата всех диапазонов, о которых вы заботились, и каждая точка данных (i) заменяется этим единственным значением.

Комментарии:

1. Можете ли вы опубликовать вывод, который воспроизводит то, что вы видите. Я не видел такого поведения, и я уделил много внимания циклам for в Matlab.

2. Вы не имеете в виду median(data(i-100:i 100)) ? (с ‘:’)

3. @Clement J. Да, я делаю. Исправлено сейчас.

Ответ №1:

Если вы напишете

 for i = (1:100)' %'# square brackets would work as well
   doSomething
end
  

цикл выполняется только один раз, поскольку a for -loop выполняет итерацию по всем столбцам всего, что находится справа от знака равенства (он будет повторяться 200 раз с массивом размером 100 на 200 справа от знака равенства).

Однако в вашем примере у вас есть i=[1:100] , который вычисляется как вектор строки. Таким образом, цикл должен выполняться 100 раз.

Если вы выполняете итерацию по массиву, который может быть nx1 вместо 1xn , вы можете, по соображениям безопасности, написать:

 for i = myArray(:)'  %'# guarantee nx1, then transpose to 1xn
end
  

Комментарии:

1. 1. За исключением последнего абзаца: i=[1:100] цикл (как в псевдокоде OP) выполняется 100 раз, а не один раз.

Ответ №2:

Это неверно. Код:

 for i=1:100
    disp(i)
end
  

будет печатать все значения от 1 до 100 последовательно. Хотя Matlab поощряет векторизацию, вы определенно можете использовать традиционные циклы со стилем кодирования, который вы использовали выше.

Комментарии:

1. 1 Лучший ответ. 🙂 Я никогда не видел поведения, описанного OP, и я уделяю довольно пристальное внимание итерациям (обратите внимание на имя пользователя …). Я не уверен, что может стоять за поведением, о котором сообщается.

2. Его outlier переменная может быть вектором столбца. for Циклы Matlab выполняют итерацию по столбцам чего-либо, а не по элементам. Для векторов строк, таких как [1:100], это то же самое; но for i = [1:100]' будет выполняться один проход.

3. @Iterator: поведение возникает, если массив равен nx1 вместо 1xn.

4. @AndrewJanke — Спасибо, я не знал об этом. Я отвечал на вопрос, как указано, но это очень хороший момент, о котором нужно знать.

5. @Jonas Спасибо за разъяснение. Я смутно помню, как это делал. Полагаю, я извлек это из своей системы, и вы продемонстрировали, почему с этим нужно быть осторожным. Хорошее понимание.