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.