Czy w MATLAB jest jakaś struktura? Jeśli tak, co się stanie, jeśli podstawowe dane ulegną zmianie (tj. Jeśli obiekty zostaną dodane do zestawu)?
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
Undefined function or variable 'B'
.A
jest to wektor wierszowy, a nie wektor kolumnowy. JeśliA
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:
Pierwsza pętla tworzy zmienną,
i
która jest skalarem i iteruje ją jak pętlę C for. Zwróć uwagę, że jeśli zmodyfikujeszi
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
działa, ale
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.
źródło
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
2) Pętla nad wektorem
3) Pętla na sznurku
4) Pętla nad jednowymiarową macierzą komórek
5) Pętla nad dwuwymiarową macierzą komórek
6) Użyj nazw pól tablic struktur
źródło
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
istructfun
może uprościć twój program.źródło
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ć:
źródło
Podczas iteracji po tablicach komórek zawierających ciągi, zmienna pętli (nazwijmy ją
f
) staje się jednoelementową tablicą komórek. Pisanief{1}
wszędzie staje się żmudne, a modyfikowanie zmiennej pętli zapewnia przejrzyste obejście.źródło
Powiedzmy, że masz tablicę danych:
możesz to „na zawsze” w ten sposób:
Spowoduje to odbicie każdego elementu w n (ale oczywiście zastąpienie i ciekawszymi rzeczami jest również możliwe!)
źródło
Myślę, że właśnie tego chce OP:
źródło
numel(array)
jest to liczba elementów w tablicy. może miałeś na myśli1:numel(array)
?for i = -1:0.1:10; disp(i); end;
byłoby lepiej?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 tegoforeach
, co by się stało .źródło