Main Content

Kontrollstrukturen

Bedingte Anweisungen – if, else, switch

Bedingte Anweisungen ermöglichen Ihnen die Auswahl des auszuführenden Codeblocks während der Laufzeit. Die einfachste bedingte Anweisung ist eine if-Anweisung. Beispiel:

% Generate a random number
a = randi(100, 1);

% If it is even, divide by 2
if rem(a, 2) == 0
    disp('a is even')
    b = a/2;
end

if-Anweisungen können alternative Auswahlmöglichkeiten umfassen, wenn die optionalen Schlüsselwörter elseif oder else verwendet werden. Beispiel:

a = randi(100, 1);

if a < 30
    disp('small')
elseif a < 80
    disp('medium')
else
    disp('large')
end

Wenn Sie anhand einer Reihe bekannter Werte auf Gleichheit prüfen möchten, können Sie alternativ eine switch-Anweisung verwenden. Beispiel:

[dayNum, dayString] = weekday(date, 'long', 'en_US');

switch dayString
   case 'Monday'
      disp('Start of the work week')
   case 'Tuesday'
      disp('Day 2')
   case 'Wednesday'
      disp('Day 3')
   case 'Thursday'
      disp('Day 4')
   case 'Friday'
      disp('Last day of the work week')
   otherwise
      disp('Weekend!')
end

Für if und switch führt MATLAB® den Code aus, der der ersten wahren Bedingung entspricht, und beendet dann den Codeblock. Jede bedingte Anweisung erfordert das Schlüsselwort end.

Wenn im Allgemeinen viele mögliche diskrete, bekannte Werte vorliegen, sind switch-Anweisungen leichter zu lesen als if-Anweisungen. Allerdings können Sie zwischen switch- und case-Werten nicht auf Ungleichheit prüfen. Sie können diesen Bedingungstyp beispielsweise nicht mit einer switch-Anweisung implementieren:

yourNumber = input('Enter a number: ');

if yourNumber < 0
    disp('Negative')
elseif yourNumber > 0
    disp('Positive')
else
    disp('Zero')
end

Arrayvergleiche in bedingten Anweisungen

Es ist wichtig, zu verstehen, wie relationale Operatoren und if-Anweisungen für Matrizen funktionieren. Wenn Sie zwischen zwei Variablen auf Gleichheit prüfen, können Sie Folgendes verwenden:

if A == B, ...

Dies ist gültiger MATLAB Programmcode und wird wie erwartet ausgeführt, wenn A und B Skalare sind. Doch wenn A und B Matrizen sind, prüft A == B nicht, ob diese gleich sind, sondern wo diese gleich sind. Das Ergebnis ist eine weitere Matrix mit Nullen und Einsen, die eine elementweise Gleichheit aufweist.

A = magic(4);
B = A;
B(1,1) = 0;

A == B

ans =

  4×4 logical array

   0   1   1   1
   1   1   1   1
   1   1   1   1
   1   1   1   1

Der richtige Weg, um auf Gleichheit zwischen zwei Variablen zu prüfen, ist die Verwendung der Funktion isequal:

if isequal(A, B), ...

isequal gibt anstelle einer Matrix einen skalaren logischen Wert von 1 (für true) oder 0 (false) als Ausdruck zurück, der von der Funktion if ausgewertet werden soll. Wenn Sie die Matrizen A und B von oben verwenden, ergibt sich Folgendes:

isequal(A,B)

ans =

  logical

   0

Auch das folgende Beispiel unterstreicht diesen Punkt. Wenn A und B Skalare sind, wird das folgende Programm niemals die „unerwartete Situation“ erreichen. Doch für die meisten Matrizenpaare, einschließlich unserer magischen Quadrate mit vertauschten Spalten, ist keine der Matrixbedingungen A > B, A < B oder A == B für alle Elemente wahr, weshalb die else-Klausel ausgeführt wird:

if A > B
   'greater'
elseif A < B
   'less'
elseif A == B
   'equal'
else
   error('Unexpected situation')
end

Verschiedene Funktionen sind hilfreich, wenn es darum geht, die Ergebnisse von Matrixvergleichen auf skalare Bedingungen für die Verwendung mit if zu reduzieren. Beispiele:

isequal
isempty
all
any

Schleifensteuerung – for, while, continue, break

In diesem Abschnitt werden MATLAB Funktionen beschrieben, die Kontrollmöglichkeiten für Programmschleifen bereitstellen.

for

Die for-Schleife wiederholt eine Anweisungsgruppe so oft wie vorab festgelegt. Mit end wird die Anweisung begrenzt:

for n = 3:32
   r(n) = rank(magic(n));
end
r

Der Strichpunkt, der die innere Anweisung beendet, unterdrückt das wiederholte Drucken und das r nach der Schleife zeigt das endgültige Ergebnis an.

Es bietet sich an, die Schleifen einzurücken, um die Lesbarkeit zu verbessern – vor allem, wenn sie verschachtelt sind:

for i = 1:m
   for j = 1:n
      H(i,j) = 1/(i+j);
   end
end

while

Die while-Schleife wiederholt eine Anweisungsgruppe unendlich oft, gesteuert durch eine logische Bedingung. Mit end wird die Anweisung begrenzt.

Im Folgenden ist ein vollständiges Programm abgebildet, das while, if, else und end veranschaulicht und mithilfe der Intervallbisektion nach einer Null eines Polynoms sucht:

a = 0; fa = -Inf;
b = 3; fb = Inf;
while b-a > eps*b
   x = (a+b)/2;
   fx = x^3-2*x-5;
   if sign(fx) == sign(fa)
      a = x; fa = fx;
   else
      b = x; fb = fx;
   end
end
x

Das Ergebnis ist eine Wurzel des Polynoms x3 – 2x – 5, nämlich

x =
   2.09455148154233

Die Vorsichtsmaßnahmen, zu denen Matrixvergleiche gehören, die im Abschnitt zur if-Anweisung erläutert werden, gelten auch für die while-Anweisung.

continue

Die continue-Anweisung übergibt die Kontrolle an die nächste Iteration der for-Schleife oder while-Schleife, in der sie vorkommt, und überspringt alle verbleibenden Anweisungen im Rumpf der Schleife. Dasselbe gilt für continue-Anweisungen in verschachtelten Schleifen. Dies bedeutet, dass die Ausführung zu Beginn der Schleife fortgesetzt wird, in der die continue-Anweisung vorgefunden wurde.

Das folgende Beispiel zeigt eine continue-Schleife, die die Codezeilen in der Datei magic.m zählt und dabei alle leeren Zeilen sowie Kommentare überspringt. Eine continue-Anweisung wird verwendet, um zur nächsten Zeile in magic.m zu wechseln, ohne den Zähler zu erhöhen, wenn eine leere Zeile oder eine Kommentarzeile vorgefunden wird:

fid = fopen('magic.m','r');
count = 0;
while ~feof(fid)
    line = fgetl(fid);
    if isempty(line) || strncmp(line,'%',1) || ~ischar(line)
        continue
    end
    count = count + 1;
end
fprintf('%d lines\n',count);
fclose(fid);

break

Die break-Anweisung ermöglicht das vorzeitige Verlassen einer for-Schleife oder while-Schleife. In verschachtelten Schleifen wird mit break nur die innerste Schleife verlassen.

Im Folgenden ist eine Verbesserung des Beispiels aus dem vorherigen Abschnitt angeführt. Warum bietet sich diese Verwendung von break an?

a = 0; fa = -Inf;
b = 3; fb = Inf;
while b-a > eps*b
   x = (a+b)/2;
   fx = x^3-2*x-5;
   if fx == 0
      break
   elseif sign(fx) == sign(fa)
      a = x; fa = fx;
   else
      b = x; fb = fx;
   end
end
x

Programmbeendigung – return

In diesem Abschnitt wird die MATLAB Funktion return beschrieben, mit der Sie Ihr Programm beenden können, bevor es abgeschlossen ist.

return

return beendet die aktuelle Befehlsfolge und übergibt die Kontrolle wieder an die aufrufende Funktion oder die Tastatur. return wird auch zum Beenden des Tastaturmodus (keyboard) verwendet. Eine aufgerufene Funktion übergibt normalerweise am Ende der Funktion die Kontrolle an die Funktion, die sie aufgerufen hat. Durch Einfügen einer return-Anweisung innerhalb der aufgerufenen Funktion können Sie eine frühzeitige Beendigung erzwingen und die Kontrolle wieder an die aufrufende Funktion übertragen.

Vektorisierung

Eine Möglichkeit zum Beschleunigen Ihrer MATLAB Programme ist die Vektorisierung der Algorithmen, die Sie beim Erstellen der Programme verwenden. Wo andere Programmiersprachen for-Schleifen oder DO-Schleifen verwenden, kann MATLAB Vektor- oder Matrixoperationen verwenden. Mit dem folgenden einfachen Beispiel wird eine Tabelle mit Logarithmen erstellt:

x = 0.01;
y = log10(x);
for k = 1:999
  x(k+1) = x(k) + 0.01;
  y(k+1) = log10(x(k+1));
end

Eine vektorisierte Version desselben Codes lautet wie folgt:

x = .01:.01:10;
y = log10(x);

Für komplizierten Code sind Vektorisierungsoptionen nicht immer so offensichtlich.

Vorabzuordnung

Wenn es nicht möglich ist, einen Codeabschnitt zu vektorisieren, können Sie Ihre for-Schleifen beschleunigen, indem Sie alle Vektoren oder Arrays, in denen Ausgabeergebnisse gespeichert werden, vorab zuordnen. Der folgende Code verwendet beispielsweise die Funktion zeros, um den in der for-Schleife erstellten Vektor vorab zuzuordnen. Dadurch wird die for-Schleife wesentlich schneller ausgeführt:

r = zeros(32,1);
for n = 1:32
    r(n) = rank(magic(n));
end

Ohne die Vorabzuordnung im vorherigen Beispiel vergrößert der MATLAB Interpreter den Vektor r um ein Element, wenn die Schleife durchlaufen wurde. Mit der Vorabzuordnung des Vektors ist dieser Schritt nicht mehr erforderlich und der Code wird schneller ausgeführt.