Gibt es eine foreach-Struktur in MATLAB? Wenn ja, was passiert, wenn sich die zugrunde liegenden Daten ändern (dh wenn Objekte zum Satz hinzugefügt werden)?
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
Undefined function or variable 'B'
.A
es sich um einen Zeilenvektor und nicht um einen Spaltenvektor handelt. WennA
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:
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
funktioniert, aber
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.
quelle
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
2) Schleife über Vektor
3) Schleife über String
4) Schleife über ein eindimensionales Zellenarray
5) Schleife über ein zweidimensionales Zellenarray
6) Verwenden Sie Feldnamen von Strukturarrays
quelle
Wenn Sie versuchen, ein Zellenarray zu durchlaufen und auf jedes Element in der Zelle etwas anzuwenden, überprüfen Sie dies
cellfun
. Es gibt aucharrayfun
,bsxfun
undstructfun
das kann Ihr Programm vereinfachen.quelle
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:
quelle
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.quelle
Angenommen, Sie haben eine Reihe von Daten:
dann können Sie es so 'foreach':
Dies wird jedes Element in n wiedergeben (aber das Ersetzen des i durch interessantere Dinge ist natürlich auch möglich!)
quelle
Ich denke, das ist es, was das OP wirklich will:
quelle
numel(array)
die Anzahl der Elemente im Array ist. vielleicht meintest du1:numel(array)
?for i = -1:0.1:10; disp(i); end;
besser?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, wasforeach
tun würde.quelle