Antworten:
Die FOR- Schleife von MATLAB ist statischer Natur. Sie können die Schleifenvariable zwischen Iterationen nicht ändern, im Gegensatz zur for- Struktur (Initialisierung; Bedingung; Inkrement) in anderen Sprachen. Dies bedeutet, dass der folgende Code unabhängig vom Wert von B immer 1, 2, 3, 4, 5 druckt.
A = 1:5;
for i = A
A = B;
disp(i);
end
Wenn Sie in der Lage sein möchten, während Iterationen auf Änderungen in der Datenstruktur zu reagieren, ist eine WHILE- Schleife möglicherweise besser geeignet. Sie können die Schleifenbedingung bei jeder Iteration testen und den Wert der Schleifenvariablen festlegen ( s) wie Sie möchten:
n = 10;
f = n;
while n > 1
n = n-1;
f = f*n;
end
disp(['n! = ' num2str(f)])
Übrigens erzeugt die for-each- Schleife in Java (und möglicherweise in anderen Sprachen) ein nicht angegebenes Verhalten, wenn die Datenstruktur während der Iteration geändert wird. Wenn Sie die Datenstruktur ändern müssen, sollten Sie eine geeignete Iterator- Instanz verwenden, mit der Elemente in der von Ihnen iterierten Sammlung hinzugefügt und entfernt werden können. Die gute Nachricht ist, dass MATLAB Java-Objekte unterstützt. Sie können also Folgendes tun:
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
es sich um einen Zeilenvektor und nicht um einen Spaltenvektor handelt. Wenn A
es sich um eine Matrix handelt, ist jedes k ein Spaltenvektor aus dieser Matrix. Transponieren ( A'
) oder vektorisieren ( A(:)'
), falls erforderlich.
.m
Dateien zu arbeiten.
Zach hat Recht mit der direkten Antwort auf die Frage.
Eine interessante Randnotiz ist, dass die folgenden zwei Schleifen nicht dasselbe ausführen:
for i=1:10000
% do something
end
for i=[1:10000]
% do something
end
Die erste Schleife erstellt eine Variable i
, die ein Skalar ist, und iteriert sie wie eine C for-Schleife. Beachten Sie dies, wenn Sie Änderungen vornehmeni
im Schleifenkörper der geänderte Wert ignoriert wird, wie Zach sagt. Im zweiten Fall erstellt Matlab ein Array mit 10k Elementen und durchläuft dann alle Elemente des Arrays.
Was dies bedeutet ist das
for i=1:inf
% do something
end
funktioniert, aber
for i=[1:inf]
% do something
end
nicht (weil dies die Zuweisung von unendlichem Speicher erfordern würde). Siehe Lorens Blog für Details.
Beachten Sie auch, dass Sie über Zellenarrays iterieren können.
Die MATLAB for- Schleife ermöglicht grundsätzlich eine enorme Flexibilität, einschließlich derfür jedesFunktionalität. Hier einige Beispiele:
1) Definieren Sie den Start-, Inkrement- und Endindex
for test = 1:3:9
test
end
2) Schleife über Vektor
for test = [1, 3, 4]
test
end
3) Schleife über String
for test = 'hello'
test
end
4) Schleife über ein eindimensionales Zellenarray
for test = {'hello', 42, datestr(now) ,1:3}
test
end
5) Schleife über ein zweidimensionales Zellenarray
for test = {'hello',42,datestr(now) ; 'world',43,datestr(now+1)}
test(1)
test(2)
disp('---')
end
6) Verwenden Sie Feldnamen von Strukturarrays
s.a = 1:3 ; s.b = 10 ;
for test = fieldnames(s)'
s.(cell2mat(test))
end
Wenn Sie versuchen, ein Zellenarray zu durchlaufen und auf jedes Element in der Zelle etwas anzuwenden, überprüfen Sie dies cellfun
. Es gibt auch arrayfun
, bsxfun
und structfun
das kann Ihr Programm vereinfachen.
Oh! nette Frage.
Die for-Schleife von Matlab verwendet eine Matrix als Eingabe und iteriert über ihre Spalten. Matlab behandelt praktisch alles nach Wert (keine Referenzübergabe), sodass ich erwarten würde, dass es eine Momentaufnahme der Eingabe der for-Schleife macht, damit sie unveränderlich ist.
Hier ist ein Beispiel, das zur Veranschaulichung beitragen kann:
>> 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
Beim Durchlaufen von Zellenarrays von Zeichenfolgen wird die Schleifenvariable (nennen wir es f
) zu einem Einzelelement-Zellenarray. f{1}
Überall schreiben zu müssen wird mühsam, und das Ändern der Schleifenvariablen bietet eine saubere Problemumgehung.
% 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]
Ab heute (27. Februar) gibt es eine neue For-Each-Toolbox im MATLAB File Exchange , die das Konzept von erfüllt foreach
. foreach
ist kein Teil der MATLAB-Sprache, aber die Verwendung dieser Toolbox gibt uns die Möglichkeit zu emulieren, was foreach
tun würde.
Undefined function or variable 'B'
.