#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 Спасибо за разъяснение. Я смутно помню, как это делал. Полагаю, я извлек это из своей системы, и вы продемонстрировали, почему с этим нужно быть осторожным. Хорошее понимание.