Цикл 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 поощряет векторизацию, вы можете определенно использовать традиционные циклы со стилем кодирования, который вы использовали выше.