Цикл 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) заменяется этим единственным значением.

2 ответов


если вы пишите

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

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

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

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

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

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

for i=1:100
    disp(i)
end

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