Відповіді:
Петля 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)])
Btw, цикл для кожного в 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
A
це вектор рядка, а не вектор стовпця. Якщо A
матриця, кожен k буде вектором стовпця з цієї матриці. Отже, перенесіть ( A'
) або векторизуйте ( A(:)'
) за потреби.
.m
файлах.
Зак правильний щодо прямої відповіді на запитання.
Цікавою стороною зауваження є те, що наступні дві петлі не виконуються однаково:
for i=1:10000
% do something
end
for i=[1:10000]
% do something
end
Перший цикл створює змінну, i
яка є скалярною, і повторює її як C для циклу. Зауважте, що якщо ви модифікуєте i
тіло циклу, змінене значення буде ігноруватися, як каже Зак. У другому випадку Matlab створює 10k-елементний масив, після чого він обходить усі елементи масиву.
Що це означає, що це
for i=1:inf
% do something
end
працює, але
for i=[1:inf]
% do something
end
ні (тому що для цього потрібно було б виділити нескінченну пам'ять). Детальніше дивіться у блозі Лорен .
Також зауважте, що ви можете перебирати масиви клітин.
MATLAB для циклу в основному забезпечує величезну гнучкість, включаючидля кожногофункціональність. Ось кілька прикладів:
1) Визначте початок, приріст та кінець індексу
for test = 1:3:9
test
end
2) Петля над вектором
for test = [1, 3, 4]
test
end
3) Петля над рядком
for test = 'hello'
test
end
4) Переведіть петлю на одновимірний масив комірок
for test = {'hello', 42, datestr(now) ,1:3}
test
end
5) Переведіть петлю на двовимірний масив комірок
for test = {'hello',42,datestr(now) ; 'world',43,datestr(now+1)}
test(1)
test(2)
disp('---')
end
6) Використовуйте назви структурних масивів
s.a = 1:3 ; s.b = 10 ;
for test = fieldnames(s)'
s.(cell2mat(test))
end
Якщо ви намагаєтеся перевести цикл на масив комірок і застосувати щось до кожного елемента в комірці, перевірте cellfun
. Є також arrayfun
, bsxfun
і structfun
що може спростити вашу програму.
ооо! акуратне питання.
Matlab's для циклу приймає матрицю як вхідний і повторює свої стовпці. Matlab також обробляє практично все за значенням (без передачі посилань), тому я би сподівався, що він зробить знімок введення для циклу, щоб він був непорушним.
ось приклад, який може допомогти проілюструвати:
>> A = zeros(4); A(:) = 1:16
A =
1 5 9 13
2 6 10 14
3 7 11 15
4 8 12 16
>> i = 1; for col = A; disp(col'); A(:,i) = i; i = i + 1; end;
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
>> A
A =
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4
Під час ітерації над масивами комірок рядків змінна циклу (назвемо її так f
) стає одноелементним масивом комірок. Необхідність писати f{1}
всюди стає втомливою, а зміна змінної циклу забезпечує чітке вирішення.
% This example transposes each field of a struct.
s.a = 1:3;
s.b = zeros(2,3);
s % a: [1 2 3]; b: [2x3 double]
for f = fieldnames(s)'
s.(f{1}) = s.(f{1})';
end
s % a: [3x1 double]; b: [3x2 double]
% Redefining f simplifies the indexing.
for f = fieldnames(s)'
f = f{1};
s.(f) = s.(f)';
end
s % back to a: [1 2 3]; b: [2x3 double]
Скажімо, у вас є масив даних:
n = [1 2 3 4 6 12 18 51 69 81 ]
тоді ви можете "передбачити" це так:
for i = n, i, end
Це повторить кожен елемент у n (але, звичайно, можлива також заміна i на більш цікаві речі!)
На сьогоднішній день (27 лютого) на обміні файлів MATLAB є нова панель інструментів For-Every, яка реалізує концепцію foreach
. foreach
не є частиною мови MATLAB, але використання цього набору інструментів дає нам можливість наслідувати те, що foreach
буде.
Undefined function or variable 'B'
.