Gibt es eine foreach in MATLAB? Wenn ja, wie verhält es, wenn die zugrunde liegenden Datenänderungen?

StackOverflow https://stackoverflow.com/questions/408080

  •  03-07-2019
  •  | 
  •  

Frage

Gibt es eine foreach Struktur in MATLAB? Wenn ja, was passiert, wenn die zugrunde liegenden Datenänderungen (das heißt, wenn Objekte zu dem Satz hinzugefügt werden)?

War es hilfreich?

Lösung

MATLAB FOR Schleife ist statisch in der Natur; Schleifenstruktur in anderen Sprachen können Sie die Schleifenvariable zwischen Iterationen, im Gegensatz zu dem für (;; Zustand Schritt Initialisierung) ändern. Dies bedeutet, dass der folgende Code druckt immer 1, 2, 3, 4, 5 unabhängig von dem Wert von B.

A = 1:5;

for i = A
    A = B;
    disp(i);
end

Wenn Sie Änderungen in der Datenstruktur während der Iterationen zu reagieren in der Lage sein, ein bis Schleife besser geeignet sein kann --- Sie in der Lage sein werden, die Schleifenbedingung bei jeder Iteration zu testen und den Wert der Schleifenvariable gesetzt (s ), wie Sie wollen:

n = 10;
f = n;
while n > 1
    n = n-1;
    f = f*n;
end
disp(['n! = ' num2str(f)])

BTW, die für-jeden Schleife in Java (und möglicherweise anderen Sprachen) erzeugt nicht spezifiziert Verhalten, wenn die Datenstruktur während der Iteration modifiziert wird. Wenn Sie die Datenstruktur ändern müssen, sollten Sie eine entsprechende Iterator Instanz, die das Hinzufügen und Entfernen von Elementen in der Sammlung, die Sie iterieren erlaubt. Die gute Nachricht ist, dass MATLAB Java-Objekte unterstützt, so dass Sie so etwas 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

Andere Tipps

Zach ist richtig über die direkte Antwort auf die Frage.

Eine interessante Randnotiz ist, dass die folgenden zwei Schleifen ausführen nicht das gleiche:

for i=1:10000
  % do something
end
for i=[1:10000]
  % do something
end

Die erste Schleife erzeugt eine variable i das ein Skalar ist, und es durchläuft es wie ein C-Schleife. Beachten Sie, dass, wenn Sie i in der Schleife, der geänderte Wert wird ignoriert ändern, wie Zach sagt. Im zweiten Fall erzeugt Matlab eine 10K-Element-Array, dann geht es um alle Elemente des Arrays.

Das bedeutet, dass

for i=1:inf
  % do something
end

funktioniert, aber

for i=[1:inf]
  % do something
end

nicht (weil dies würde man unendlich Speicher benötigen Zuteilung). Siehe Loren Blog .

Beachten Sie auch, dass Sie über Zellenanordnungen laufen kann.

Die MATLAB für Schleife ermöglicht grundsätzlich eine enorme Flexibilität, einschließlich die Funktionalität markiert. Hier einige Beispiele:

1) definiert Anfang, erhöht und Ende Index

for test = 1:3:9
   test
end

2) Schleife über Vektor

for test = [1, 3, 4]
   test
end

3) Schleife über Zeichenfolge

for test = 'hello'
   test
end

4) Schleife über ein eindimensionales Zellenfeld

for test = {'hello', 42, datestr(now) ,1:3}
   test
end

5) Schleife über einen zweidimensionalen Zellenmatrix

for test = {'hello',42,datestr(now) ; 'world',43,datestr(now+1)}
   test(1)   
   test(2)
   disp('---')
end

6) Verwendung von Feldnamen Strukturarrays

s.a = 1:3 ; s.b = 10  ; 
for test = fieldnames(s)'
   s.(cell2mat(test))
end

Wenn Sie eine Schleife über ein Zellenfeld versuchen und gelten etwas für jedes Element in der Zelle Besuche cellfun. Es gibt auch arrayfun, bsxfun und structfun, die Ihr Programm vereinfachen können.

ooh! ordentlich Frage.

Matlab for-Schleife nimmt eine Matrix als Eingabe und iteriert über ihre Spalten. Matlab behandelt auch praktisch alles von Wert (keine Pass-by-reference), so würde ich erwarten, dass es eine Momentaufnahme der for-Schleife der Eingabe nimmt also unveränderlich ist.

Hier ist ein Beispiel, das veranschaulichen kann helfen:

>> 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

Wenn über Zellenanordnungen von Strings Iterieren, die Schleifenvariable (nennen wir es f) wird zu einem Einzelelement-Zellenanordnung. f{1} überall bekommt langweilig, und Modifizieren der Schleifenvariable bietet eine saubere Abhilfe zu schreiben.

% 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]

Angenommen, Sie haben eine Reihe von Daten:

n = [1    2   3   4   6   12  18  51  69  81  ]

, dann können Sie 'foreach' es wie folgt aus:

for i = n, i, end

Das wird jedes Element in n echo (aber die i mit interessanten Sachen zu ersetzen ist natürlich auch möglich!)

Ich denke, das ist das, was die OP wirklich will:

array = -1:0.1:10

for i=1:numel(array)
    disp(array(i))
end

Ab heute (27. Februar), gibt es ein neues Für -Jeder Toolbox auf dem Exchange-MATLAB-Datei , dass das Konzept der foreach erreicht. foreach ist kein Teil der MATLAB-Sprache, doch diese Toolbox gibt uns die Möglichkeit zu emulieren, was foreach tun würde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top