4. Vorlesung, 2. Teil: Die for-Schleife und Vektorisierung
Contents
Einleitung
Bisher wurden Matlab-Anweisungen immer in der Reihenfolge ausgefuehrt, in der sie in dem Skript erscheinen. Durch Verwendung einer for-Schleife koennen wir Befehle mehrfach nacheinander ausfuehren.
Bspiel 1
for i=1:10 fprintf('Hallo Studenten! Dies ist eine Iteration %d\n',i); end
Hallo Studenten! Dies ist eine Iteration 1 Hallo Studenten! Dies ist eine Iteration 2 Hallo Studenten! Dies ist eine Iteration 3 Hallo Studenten! Dies ist eine Iteration 4 Hallo Studenten! Dies ist eine Iteration 5 Hallo Studenten! Dies ist eine Iteration 6 Hallo Studenten! Dies ist eine Iteration 7 Hallo Studenten! Dies ist eine Iteration 8 Hallo Studenten! Dies ist eine Iteration 9 Hallo Studenten! Dies ist eine Iteration 10
help for
FOR Repeat statements a specific number of times. The general form of a FOR statement is: FOR variable = expr, statement, ..., statement END The columns of the expression are stored one at a time in the variable and then the following statements, up to the END, are executed. The expression is often of the form X:Y, in which case its columns are simply scalars. Some examples (assume N has already been assigned a value). for R = 1:N for C = 1:N A(R,C) = 1/(R+C-1); end end Step S with increments of -0.1 for S = 1.0: -0.1: 0.0, do_some_task(S), end Set E to the unit N-vectors for E = eye(N), do_some_task(E), end Long loops are more memory efficient when the colon expression appears in the FOR statement since the index vector is never created. The BREAK statement can be used to terminate the loop prematurely. See also PARFOR, IF, WHILE, SWITCH, BREAK, CONTINUE, END, COLON. Reference page in Help browser doc for
Beispiel 2
for i=1:2:10 fprintf('Nochmal Hallo! %d\n',i); end
Nochmal Hallo! 1 Nochmal Hallo! 3 Nochmal Hallo! 5 Nochmal Hallo! 7 Nochmal Hallo! 9
Beispiel 3
for i=10:-2:0 fprintf('So geht es auch. %d\n',i); end
So geht es auch. 10 So geht es auch. 8 So geht es auch. 6 So geht es auch. 4 So geht es auch. 2 So geht es auch. 0
Die Anzahl der Iterationen wird durch die Laenge des Index-Feldes bestimmt.
Beispiel 4
for x = [2.73 4.82] fprintf('Hallo! x = %4.2f\n',x); end
Hallo! x = 2.73 Hallo! x = 4.82
Oftmal nutzt die Anweisung innerhalb der for-Schleife den Wert der Index-Variablen.
Beispiel 5 - Ausgabe des Feldes x in umgekehrter Reihenfolge
x = rand(1,10); for k=10:-1:1 fprintf('x(%2d) = %8.4f\n',k,x(k)); end
x(10) = 0.6787 x( 9) = 0.9340 x( 8) = 0.8491 x( 7) = 0.0357 x( 6) = 0.6557 x( 5) = 0.9595 x( 4) = 0.7922 x( 3) = 0.9157 x( 2) = 0.4218 x( 1) = 0.1419
Beispiel 6 - Definiere Werte eines Feldes y und gib die Werte aus.
for j=1:8 y(j) = sin(pi*(j-1)/2); fprintf('y(%d) = %16.8f\n',j,y(j)); end
y(1) = 0.00000000 y(2) = 1.00000000 y(3) = 0.00000000 y(4) = -1.00000000 y(5) = -0.00000000 y(6) = 1.00000000 y(7) = 0.00000000 y(8) = -1.00000000
Berechne die Summe der natuerlichen Zahlen von 1 bis 100:
s = 0; for k=1:10 s = s+k; fprintf('Summe der Zahlen von 1 bis %2d: %5d\n',k,s); end
Summe der Zahlen von 1 bis 1: 1 Summe der Zahlen von 1 bis 2: 3 Summe der Zahlen von 1 bis 3: 6 Summe der Zahlen von 1 bis 4: 10 Summe der Zahlen von 1 bis 5: 15 Summe der Zahlen von 1 bis 6: 21 Summe der Zahlen von 1 bis 7: 28 Summe der Zahlen von 1 bis 8: 36 Summe der Zahlen von 1 bis 9: 45 Summe der Zahlen von 1 bis 10: 55
Verwendung von cumsum (vektorisierte Form)
y = cumsum(1:10);
fprintf('Summe der Zahlen von 1 bis %2d: %5d\n',[1:10; y]);
Summe der Zahlen von 1 bis 1: 1 Summe der Zahlen von 1 bis 2: 3 Summe der Zahlen von 1 bis 3: 6 Summe der Zahlen von 1 bis 4: 10 Summe der Zahlen von 1 bis 5: 15 Summe der Zahlen von 1 bis 6: 21 Summe der Zahlen von 1 bis 7: 28 Summe der Zahlen von 1 bis 8: 36 Summe der Zahlen von 1 bis 9: 45 Summe der Zahlen von 1 bis 10: 55
Zusammenfassung
- Die for-Schleife kann mehrere Matlab Anweisungen enthalten
- Die Anzahl der Ausfuehrungen der in der for-Schleife eingeschlossenen Anweisungen haengt von der Laenge des Index-Feldes ab
- Die Loop Index-Variable kann von den Matlab-Anweisungen genutzt werden
- Typischerweise enthaelt das Loop Index-Feld natuerliche Zahlen. Oft verwendet man Variablennamen i,j,k,m oder n.
Wann ersetzt man eine for-Schleife durch eine vektorisierte Anweisung?
In Matlab kann man oft for-Schleifen durch vektorielle Anweisungen ersetzen.
Beispiel 1: for-Schleife: y = 10*x+1
clear all; x = rand(1,5); y = zeros(size(x)); for i=1:5 y(i) = 10*x(i)+1; fprintf('x(%d) = %8.4f; y(%d) = %8.4f\n',i,x(i),i,y(i)); end
x(1) = 0.7577; y(1) = 8.5774 x(2) = 0.7431; y(2) = 8.4313 x(3) = 0.3922; y(3) = 4.9223 x(4) = 0.6555; y(4) = 7.5548 x(5) = 0.1712; y(5) = 2.7119
Vektorisierte Form
y = 10*x+1;
fprintf('x(%d) = %8.4f; y(%d) = %8.4f\n',[1:5; x; 1:5; y])
x(1) = 0.7577; y(1) = 8.5774 x(2) = 0.7431; y(2) = 8.4313 x(3) = 0.3922; y(3) = 4.9223 x(4) = 0.6555; y(4) = 7.5548 x(5) = 0.1712; y(5) = 2.7119
Beispiel 2: for-Schleife: y = sin(pi*x/4) auf dem Intervall [0,2*pi]
for j=1:9 y(j) = sin(pi*(j-1)/4); fprintf('y(%d) = %16.8f\n',j,y(j)); end
y(1) = 0.00000000 y(2) = 0.70710678 y(3) = 1.00000000 y(4) = 0.70710678 y(5) = 0.00000000 y(6) = -0.70710678 y(7) = -1.00000000 y(8) = -0.70710678 y(9) = -0.00000000