Есть ли в MATLAB структура foreach? Если так, что произойдет, если базовые данные изменятся (то есть, если объекты будут добавлены в набор)?
Цикл FOR MATLAB является статическим по своей природе; Вы не можете изменять переменную цикла между итерациями, в отличие от структуры цикла for (инициализация; условие; приращение) в других языках. Это означает, что следующий код всегда печатает 1, 2, 3, 4, 5 независимо от значения B.
A = 1:5;
for i = A
A = B;
disp(i);
end
Если вы хотите иметь возможность реагировать на изменения в структуре данных во время итераций, цикл WHILE может быть более подходящим - вы сможете проверять условие цикла на каждой итерации и устанавливать значение переменной цикла ( s) по вашему желанию:
n = 10;
f = n;
while n > 1
n = n-1;
f = f*n;
end
disp(['n! = ' num2str(f)])
Кстати, цикл for-each в Java (и, возможно, в других языках) создает неопределенное поведение, когда структура данных изменяется во время итерации. Если вам нужно изменить структуру данных, вы должны использовать соответствующий экземпляр Iterator, который позволяет добавлять и удалять элементы в итерируемой коллекции. Хорошей новостью является то, что MATLAB поддерживает объекты Java, поэтому вы можете сделать что-то вроде этого:
A = java.util.ArrayList();
A.add(1);
A.add(2);
A.add(3);
A.add(4);
A.add(5);
itr = A.listIterator();
while itr.hasNext()
k = itr.next();
disp(k);
% modify data structure while iterating
itr.remove();
itr.add(k);
end
Undefined function or variable 'B'
.A
это вектор строки, а не вектор столбца. ЕслиA
это матрица, то каждый k будет вектором столбца из этой матрицы. Таким образом, transpose (A'
) или vectorize (A(:)'
) при необходимости..m
файлах.Зак прав насчет прямого ответа на вопрос.
Интересно отметить, что следующие два цикла не выполняются одинаково:
Первый цикл создает переменную,
i
которая является скаляром, и повторяет ее как цикл C for. Обратите внимание, что если вы изменяетеi
в теле цикла, измененное значение будет игнорироваться, как говорит Зак. Во втором случае Matlab создает массив из 10 тыс. Элементов, а затем обходит все элементы массива.Это значит, что
работает, но
нет (потому что это потребовало бы выделения бесконечной памяти). Смотрите блог Лорен для деталей.
Также обратите внимание, что вы можете перебирать массивы ячеек.
источник
MATLAB for loop в основном обеспечивает огромную гибкость, включаядля каждогофункциональность. Вот несколько примеров:
1) Определить начальный, приращенный и конечный индекс
2) Цикл по вектору
3) Зациклить строку
4) зацикливание на одномерном массиве ячеек
5) Зацикливание на двумерном массиве ячеек
6) Используйте имена полей структурных массивов
источник
Если вы пытаетесь перебрать массив ячеек и применить что-то к каждому элементу в ячейке, проверьте
cellfun
. Там жеarrayfun
,bsxfun
иstructfun
что может упростить вашу программу.источник
ооо! аккуратный вопрос.
Цикл for Matlab принимает матрицу в качестве входных данных и перебирает ее столбцы. Matlab также обрабатывает практически все по значению (без передачи по ссылке), поэтому я ожидаю, что он сделает снимок ввода цикла for, чтобы он был неизменным.
Вот пример, который может помочь проиллюстрировать:
источник
При переборе массивов ячеек строк переменная цикла (давайте назовем ее
f
) становится одноэлементным массивом ячеек. Необходимость писатьf{1}
везде становится утомительной, а изменение переменной цикла обеспечивает чистый обходной путь.источник
Допустим, у вас есть массив данных:
тогда вы можете «предвидеть» это так:
Это будет отображать каждый элемент в n (но замена i на более интересные вещи также возможна, конечно!)
источник
Я думаю, что это то, чего действительно хочет ОП:
источник
numel(array)
как это количество элементов в массиве. возможно ты имел ввиду1:numel(array)
?for i = -1:0.1:10; disp(i); end;
будет лучше?На сегодняшний день (27 февраля) в MATLAB File Exchange появился новый набор инструментов For-Each, который реализует концепцию
foreach
.foreach
не является частью языка MATLAB, но использование этого набора инструментов дает нам возможность подражать тому, чтоforeach
будет делать.источник