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

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