Odpowiedzi:
Pętla FOR w MATLAB-ie ma charakter statyczny; nie można modyfikować zmiennej pętli między iteracjami, w przeciwieństwie do struktury pętli for (inicjalizacja; warunek; przyrost) w innych językach. Oznacza to, że poniższy kod zawsze wypisuje 1, 2, 3, 4, 5 niezależnie od wartości B.
A = 1:5;
for i = A
A = B;
disp(i);
end
Jeśli chcesz móc reagować na zmiany w strukturze danych podczas iteracji, pętla WHILE może być bardziej odpowiednia - będziesz mógł przetestować warunek pętli w każdej iteracji i ustawić wartość zmiennej pętli ( s) jak chcesz:
n = 10;
f = n;
while n > 1
n = n-1;
f = f*n;
end
disp(['n! = ' num2str(f)])
Przy okazji, pętla for-each w Javie (i prawdopodobnie w innych językach) powoduje nieokreślone zachowanie, gdy struktura danych jest modyfikowana podczas iteracji. Jeśli potrzebujesz zmodyfikować strukturę danych, powinieneś użyć odpowiedniej instancji Iteratora, która umożliwia dodawanie i usuwanie elementów w kolekcji, którą iterujesz. Dobra wiadomość jest taka, że MATLAB obsługuje obiekty Java, więc możesz zrobić coś takiego:
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
jest to wektor wierszowy, a nie wektor kolumnowy. Jeśli A
jest macierzą, każde k będzie wektorem kolumnowym z tej macierzy. W razie potrzeby transponuj ( A'
) lub wektoryzuj ( A(:)'
).
.m
plikach.
Zach ma rację co do bezpośredniej odpowiedzi na pytanie.
Ciekawą uwagą na marginesie jest to, że następujące dwie pętle nie wykonują tego samego:
for i=1:10000
% do something
end
for i=[1:10000]
% do something
end
Pierwsza pętla tworzy zmienną, i
która jest skalarem i iteruje ją jak pętlę C for. Zwróć uwagę, że jeśli zmodyfikujesz i
treść pętli, zmodyfikowana wartość zostanie zignorowana, jak mówi Zach. W drugim przypadku Matlab tworzy 10k-elementową tablicę, a następnie przechodzi przez wszystkie elementy tablicy.
Co to oznacza, że
for i=1:inf
% do something
end
działa, ale
for i=[1:inf]
% do something
end
nie (ponieważ ten wymagałby przydzielenia nieskończonej ilości pamięci). Zobacz blog Lorena po szczegóły.
Zauważ również, że możesz iterować po tablicach komórek.
Pętla MATLAB for zasadniczo zapewnia ogromną elastyczność, w tymdla każdegofunkcjonalność. Oto kilka przykładów:
1) Zdefiniuj indeks początkowy, przyrostowy i końcowy
for test = 1:3:9
test
end
2) Pętla nad wektorem
for test = [1, 3, 4]
test
end
3) Pętla na sznurku
for test = 'hello'
test
end
4) Pętla nad jednowymiarową macierzą komórek
for test = {'hello', 42, datestr(now) ,1:3}
test
end
5) Pętla nad dwuwymiarową macierzą komórek
for test = {'hello',42,datestr(now) ; 'world',43,datestr(now+1)}
test(1)
test(2)
disp('---')
end
6) Użyj nazw pól tablic struktur
s.a = 1:3 ; s.b = 10 ;
for test = fieldnames(s)'
s.(cell2mat(test))
end
Jeśli próbujesz zapętlić tablicę komórek i zastosować coś do każdego elementu w komórce, sprawdź cellfun
. Jest też arrayfun
, bsxfun
i structfun
może uprościć twój program.
ooh! fajne pytanie.
Pętla for Matlaba pobiera macierz jako dane wejściowe i iteruje po jej kolumnach. Matlab obsługuje również praktycznie wszystko według wartości (bez przekazywania przez odniesienie), więc spodziewałbym się, że pobiera migawkę wejścia pętli for, więc jest niezmienny.
oto przykład, który może pomóc zilustrować:
>> 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
Podczas iteracji po tablicach komórek zawierających ciągi, zmienna pętli (nazwijmy ją f
) staje się jednoelementową tablicą komórek. Pisanie f{1}
wszędzie staje się żmudne, a modyfikowanie zmiennej pętli zapewnia przejrzyste obejście.
% 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]
Na dzień dzisiejszy (27 lutego) dostępny jest nowy zestaw narzędzi For-Each w wymianie plików MATLAB, który realizuje koncepcję foreach
. foreach
nie jest częścią języka MATLAB, ale użycie tego zestawu narzędzi daje nam możliwość emulacji tego foreach
, co by się stało .
Undefined function or variable 'B'
.