4.3 – Programmieren mit Matlab

Grundlagen, Kontrollstrukturen, Arrays

4.3 - MatLab Grundlagen

Variablen, Funktionen

Lessons Learned

In diesem Kapitel geht es darum folgende Dinge zu verstehen und zu können

  • Was ist ein Programm
  • Was ist eine Variable
    • Welche Datentypen gibt es
    • Unterschied zu Literalen
  • Wie kann ich Rechnen
  • EVA-Prinzip

Hello World

Das erste Programm

  • „Hello World“ ist traditionell das erste Programm, das man in einer neuen Sprache schreibt.
  • Es gibt einfach die Textzeile „Hello World“ aus.

Warum macht man das?

  • Der Programmierer erlernt alles was notwendig ist um ein minimales Programm zum Laufen zu kriegen.
  • Es geht nicht um das Programm, sondern um das „Drumherum“.

Starten eines Matlab Programms

Matlab Scripte sind Textdateien, die Anweisungen für den Matlab interpreter enthalten

Sie lassen sich am einfachsten mit Matlab selbst ausführen.

Screenshot von Matlab Screenshot von Matlab in der Standardkonfiguration

HelloWorld

Für eine Hello World erstellen wir eine Textdatei Hello.m mit dem Inhalt:

disp("Hello World");
  • Diese öffnen wir in Matlab und füren Sie mit dem “Run”-Button aus.
  • In der Ausgabe Erscheint dann “Hello World”

Reihenfolge

  • In einem Matlab-Skript werden die Zeilen in der Textdatei von oben nach unten Ausgeführt
disp("Hello World");
disp("Und Tschuess");
  • Dieses Skript gibt den folgenden Text aus:

Hallo World
Und Tschuess

Formatierung

  • Matlab kann Anweisungen auf 2 verschiedene Arten abschliesen:

    1. ‘;’ - Ein Semikolon
    2. Ein Zeilenumbruch
  • Das Semikolon unterdrückt dabei die Ausgabe der Anweisung. Das ist das normalerweise gewünschte Verhalten

  • Bei einem Zeilenumbruch ohne Semilkolon wird das das Ergebnis der Anweisung angezeigt. Dies ist zur Fehlersuche in kleinen Programmen nützlich, wird aber schnell unübersichtlich.

Variablen

Programmiersprachen besitzen die wichtige Fähigkeit Variablen zu speichern.

Variable

Platz im Hauptspeicher der einen Namen erhalten hat und darüber ansprechbar ist. Vergleichbar mit einer Box die einen Namen und einen Inhalt hat.

Variablen

Datentypen

Jede Variable hat neben Name und Inhalt auch einen Typ.

Datentyp

Gibt an, ob in der Variablen eine Zeichenkette, eine ganze Zahl, eine reelle Zahl oder etwas anderes gespeichert werden kann. Wir unterscheiden in Matlab:

  • Numerische Typen
  • Textuelle Typen

Numerische Typen

Die 5 wichtigsten numerischen Typen in Matlab sind:

  • int32 (2er Komplement 32 bit)
  • int64 (2er Komplement 64 bit)
  • uint32 (positive Ganzzahl 32 bit)
  • single (einfach genau gl. Kommazahl)
  • double (doppelt genau gl. Kommazahl)

Textuelle Typen

Neben den numerischen Typen gibt es noch 2 Textuelle Typen. Achtung Mit diesen Typen können Sie keine Berechnungen durchführen

  • string - Eine Zeichenkette bestehend aus mehreren Zeichen
  • char - Ein einzelnes Zeichen

Nutzt die Standard System Codierung

Variablen und Datentypen

Bei unserem Beispiel von eben:

Name Typ Wert (Inhalt)
greeting string (Zeichenkette) Hello.
hour int (Ganzzahl) 11
minute int (Ganzzahl) 59

Deklaration

Um eine Variable zu erzeugen muss Sie zunächst deklariert werden. Dies passiert in Matlab impliziet bei der ersten Zuweisung der Variablen

myVariable = 5
  • Falls myVariable nicht vorhanden wird sie angelegt (Deklaration)
  • Gibt es myVariable wird auf der Speicheraddresse ein neuer Wert gespeichert (Zuweisung)

Deklaration

  • Variablen müssen deklariert werden!
  • Eine Variable erhält dabei einen bestimmten Namen und einen bestimmten Typ, sowie ein Stück des Hauptspeichers.
  • Es kann nicht auf Variablen zugegriffen werden die noch nicht deklariert wurden
disp(a); % Output: Undefined function or variable 'a'.

Datentypen

Matlab “rät” den Datentyp bei der Zuweisung

a=4;
b=4.5;
c='hallo';
d="Welt";

<span class='fragment color-red’

Welche Datentypen haben die Variablen?

Datentypen implizit

  • Wenn man den Informationen über eine oder mehrere Variablen sehen möchte hilft einem das whos Kommando.
a=4;b=4.5;c='hallo';d="Welt";
whos a b c d

Ausgabe:

Name      Size            Bytes  Class     Attributes

  a         1x1                 8  double              
  b         1x1                 8  double              
  c         1x5                10  char                
  d         1x1               158  string   
Matlab speichert alle Zahlen intern als Double

Datentypen explizit

*a=int32(4);
*b=double(4.5);
c='hallo';d="Welt";
whos a b c d

Ausgabe:

  Name      Size            Bytes  Class     Attributes

* a         1x1                 4  int32               
  b         1x1                 8  double              
  c         1x5                10  char                
  d         1x1               158  string        

Namen von Variablen

Zwingende Regeln und Einschränkungen durch Code Conventions

  • Variablennamen beginnen mit einem Kleinbuchstaben
  • Die restlichen Zeichen dürfen aus Klein- und Großbuchstaben, Ziffern und dem Unterstrich (_) bestehen
  • Groß- und Kleinschreibung wird beachtet: name, nAme und nAME sind unterschiedliche Namen.
    • Bitte nicht ausnutzen: Variablen Namen sollten nicht zu ähnlich gewählt werden

Namen von Variablen

Zwingende Regeln und Einschränkungen durch Code Conventions

  • Besteht ein Variablenname aus mehreren Worten, werden diese direkt zusammengesetzt. Jedes Teilwort beginnt mit einem Großbuchstaben („Kamelhöckerschreibweise“, „Camelcases“).
    • Beispiel: Eine Variable die Worte zählt, könnte wortZaehler heißen.
    • In C würde stattdessen wort_zaehler geschrieben.
  • Aus der Bezeichnung der Variablen sollte möglichst klar die Bedeutung hervorgehen!
  • Einweg-(throwaway)-Variablen, die nur temporär benötigt werden, dürfen auch aus einzelnen Buchstaben bestehen.
    • Gängig sind i, j, k, m und n für Integer-Einweg-Variablen.

Rechnen mit Variabeln

Einfach Ausgabe:

disp(hour);

Wichtig: Hier wird nicht der Text „hour“ ausgegeben, sondern der Wert der Variablen hour !

Rechnen mit Variablen

Um einer Variablen einen Wert zu zuweisen, verwenden wir den Wertzuweisungsoperator „=“.

minute = 5;

Wichtig: Die Variable auf der linken Seite erhält das Ergebnis des Ausdrucks auf der rechten Seite. Es handelt sich dabei nicht um eine mathematische Gleichung! Deshalb ist auch Folgendes möglich:

minute = minute + 5;

Rechnen mit Variabeln

minute = minute + 5;
  • Dies bedeutet:
    • Nimm den Wert der Variablen minute, addiere 5 und weise das Ergebnis wieder der Variablen minute zu.
  • Auf der rechten Seite der Zuweisung darf ein Ausdruck stehen, der eine beliebige Anzahl von Operatoren verwendet.
  • Die bekannten Grundrechenarten sind: +, -, *, /
minute = 5 + 20 / 423 * 12;

Rechnen mit Variabeln

Programm, das den Kehrwert einer Zahl a berechnet:

a = 7;
a = 1 / a;
disp(a);

Ergebnis → 0.14285714285714285

Operationen sind auch innerhalb eines Methodenaufrufs möglich:

disp(2+5);

Literale

Beispiel: a = 3.7 + 4 * 2;

Hier stehen drei Zahlen direkt im Code. Solche Werte heißen Literale. Literale haben neben ihrem Wert auch einen Typ, der sich aus ihrer Schreibweise ergibt.

Es gibt double-, boolean-, char-, und string-Literale.

Literale

Typ Literal Beispiele
double Reine Zahl 23 -42
23.5 -42.
1e5 4E-3
boolean “true” oder “false” true false
char Zeichen in einzelnen Hochkommata ‘a’ ‘3’
string Zeichenkette in doppelten Hochkommata “a” “3” “Hallo”

Integer-Division

Das Ergebnis einer Division von 2 Integer-Zahlen ist selbst auch eine Integer-Zahl

a=int32(5);
b=int32(11);
c=a/b;
disp(c);

Ausgabe: 1

Da Integer Werte keine Dezimalstellen speichern können rundet Matlab das Ergebnis

Um ein exaktes Ergebnis zu erhalten braucht man den Code:

a=int32(5);
b=int32(11);
c=double(a)/double(b);
disp(c);

Auswertungsreihenfolge

Wie aus der Schule bekannt, gibt es bei einzelnen Operationen eine Hierarchie.

“Punkt- vor Strichrechnung”

Um die Auswertungsreihenfolge zu ändern, dürfen Klammern gesetzt werden.

Beispiel

a = 3 + 4 * 2; %→ ergibt 11
b = (3 + 4) * 2; %→ ergibt 14

Bei mehreren Operationen wird von links nach rechts ausgeführt.

Verkettungsoperator für Strings

Für Strings gibt es einen einzigen Operator: +

disp("Hallo" +"welt");
% Ausgabe "Hallowelt"

Konvertieren in Strings

Ist ein Argument eines +-Ausdrucks ein String, so werden alle anderen Summanden automatisch in String umgewandelt.

a=int32(5);
b=10
disp("a=" + a + ",b=" + b); % Ausgabe: a=5,b=10

Kommentare

Definition Definition Ein Kommentar ist ein Stück Text, der erklärt, was ein Programm an dieser Stelle tut. Java selbst ignoriert die Kommentare beim Kompilieren.

  • Zeilenkommentare:
    • Das Kommentarzeichen für Zeilenkommentar besteht aus einem Prozentzeichen „%“. Der Text ab dem Kommentarzeichen bis zum Zeilenende zählt als Kommentar.
% Zeilenkommentar
disp("Hallo"); % Weiterer Zeilenkommentar

Blockkommentare: Blockkommentare beginnen mit „%{“ und enden mit „}%“. Alle Zeichen dazwischen zählen als Kommentar.

%{
Das ist
ein grosser
Blockkommentar
}%

Aufruf von Funktionen

Ausgabe von Daten

  • Um Daten auszugeben gibt es in Matlab die Funktion disp().
  • Diese Funktion kann entweder einen Text, oder den Inhalt einer Variablen ausgeben

Einlesen von Daten

a = input("Bitte eine Wert für a eingeben:");
s = input("Bitte eine Zeichenkette eingeben", `s`);
  • Um Daten von der Tastatur einzulesen gibt es in Matlab die Funktion input(),
  • Diese gibt es in 2 Varianten
    1. input(string): Die Eingabe des Nutzers wird als Literal interpretiert.
    2. input(string,s): Die Eingabe wird als String ohne Interpretation gespeichert

Mathematische Funktionen

Matlab bietet eine Reihe von Mathematischen Funktionen. Eine Liste finden Sie in der Dokumentation hier.

zum Beispiel:

x = 25;
y = sin(x); % sinus, Achtung Bogenmaß
y = cos(x); % cosinus, Achtung Bogenmaß
y = sqrt(x); % wurzel
y = abs(x); % Betrag
% ...

Schreiben einer eigenen Funktion

Nehmen wir an, wir benötigen eine Funktion, die den Abstand eines Punktes (x/y) im zweidimensionalen Raum zum Koordinatenursprung berechnet. Die mathematische Funktion ist:

$$f(x,y)=\sqrt{x^2+y^2}$$

Das eigentliche Script was die Funktion benutzt sieht dann wie folgt aus:

xK = 3.2;
yK = 5.7;

d = getDistance(xK, yK);
disp(d);

Definition einer Funktion

function d = getDistance(x,y)
    d = sqrt(x^2+y^2);
end

Die Erste Zeile wird Kopfzeile, Signatur oder Deklaration der Funktion genannt.

Bedeutung der Signatur:

  • function: Schlüsselwort um die Deklaration einer Funktion einzuleiten
  • d: Variabelname für das Ergebniss
  • getDistance: Name der Funktion, frei vom Programmierer wählbar
  • (x,y): In Klammern stehen die beiden Übergabeparameter. Für jeden Parameter wird der Variablenname angegeben. Die übergebenen Werte werden in diese Variablen kopiert und können innerhalb der Methode unter den entsprechenden Namen angesprochen werden.

Position im Script

Funktionen werden in Matlab in der Regel am Ende eines Scripts deklariert.

Ausnahme:

Ihr Script enthält nur Funktionsdeklarationen. Dann muss der Name der ersten Funktion mit dem Dateinamen übereinstimmen

Fehlermeldung

Wenn die Funktion nicht an der richtigen Stelle ist erscheint folgende Fehlermeldung:

Error: File: Demo.m Line: 5 Column: 1
This statement is not inside any function.
 (It follows the END that terminates the definition of the function "getDistance".)

Vorteile

Vermeidung von doppeltem Code

  • Ein Programm, welches häufig Distanzen berechnet, wird durch die statische Methode getDistance und besser verständlich.
  • Zudem muss man nur eine Stelle im Code ändern, sollte sich ein Fehler in der Distanzberechnung befinden

Eingabe - Verarbeitung - Ausgabe

Das EVA-Prinzip ist ein wichtiger Grundsatz in der Softwareentwicklung:

  • Ein Programm besteht aus Eingabe, Verarbeitung und Ausgabe
  • Prinzip ist einfach und leicht umzusetzen
  • Bei komplexen Programmen auf Verstöße achten
    • ggf. modernere Entwicklungs-Muster (MVC, 3-Ebenen, …)
  • Für uns zunächst ausreichend

Wir betrachten ein kleines Programm, das zwei Gleitkommazahlen x und y einliest und die Distanzfunktion verwendet.

Beispiel EVA

% Eingabe
xK = input("Bitte x Koordinate eingeben:");
yK = input("Bitte y Koordinate eingeben:");

% Verarbeitung
d = getDistance(xK, yK);

% Ausgabe
disp(d);

function d = getDistance(x,y)
    d = sqrt(x^2+y^2);
end

4.3 - MatLab Arrays

Mehrdimensionale Datenstrukturen

Definition

Ein Feld (englisch field, array [əˈɹeɪ] (Betonung auf 2. Silbe) für ‚Anordnung‘, ‚Aufstellung‘ usw.) ist in der Informatik eine Datenstruktur-Variante, mit deren Verwendung „viele gleichartig strukturierte Daten […] verarbeitet werden sollen“.[1] Der Zugriff auf bestimmte Inhalte eines Felds erfolgt mit Hilfe von Indizes, die dessen Position bezeichnen. Wikipedia, 2018

[1]: Programmieren in Fortran, Uni Bayreuth

  • Synonyme: Array, Tabelle, Vektor, Reihe, Reihung, Datenfeld, Aufstellung, Bereich, Gate Array, Matrix/Matrize
  • Gängigster Begriff: Array

Definition

  • Jede Variable in Matlab (kurz für Matrix-Laboratory) wird als Liste behandelt
  • Jedes Element in der Liste hat den gleichen Typ
  • Zusätzlich zu dem Namen und dem Inhalt besitzt jede Variable auch noch eine Länge
  • Bisher hatten unsere Variablen immer die Länge 1

Beispiel

v1=1;v2=[1 2];
whos v1 v2

Ausgabe:

  Name      Size            Bytes  Class     Attributes

  v1        1x1                 8  double              
  v2        1x2                16  double              

Arrays erzeugen

Um einen Array anzulegen, benutzen sie [] und schreiben die Elemente einfach mit Leerzeichen oder , getrennt hinein:

a = [1 2 3 4]

Um mehrer Zeilen anzulegen benutzen Sie ;

a = [1 2 3; 4 5 6; 7 8 10]

Eine Matrix mit 0 lässt sich mit der Funktion zeros(zeilen,spalten) erzeugen.

a = zeros(5,1)

Matrix Operationen

Die meisten Arithmetischen Operatoren werden Elementweise auf eine Matrix angewendet:

a+10 % mit a = [1 2 3; 4 5 6; 7 8 10]

Ausgabe:

ans = 3×3

    11    12    13
    14    15    16
    17    18    20

Das gleiche gilt für +,-,*,/

Matrix Funktionen

Das funktioniert auch bei skalaren Funktionen

sin(a) % mit a = [1 2 3; 4 5 6; 7 8 10]

Ausgabe:

ans = 3×3

    0.8415    0.9093    0.1411
   -0.7568   -0.9589   -0.2794
    0.6570    0.9894   -0.5440

Das gleiche gilt für cos(),sqrt()...

Spezielle Matrixoperatoren

Matrizen lassen sich mit ' transponieren (Vertauschen von Zeilen und Spalten)

a' % mit a = [1 2 3; 4 5 6; 7 8 10]

Ausgabe:

ans = 3×3

     1     4     7
     2     5     8
     3     6    10

Inverse Matrizen

  • Die Inverse einer Matrix (falls existent) lässt sich mit der Funktion inv() bestimmen
p = a*inv(a)

Ausgabe: (double Ungenauigkeit)

p = 3×3

   1.000000000000000                   0  -0.000000000000000
                   0   1.000000000000000                   0
                   0                   0   0.999999999999998

Matrix Operatoren

  • Werden zwei Matritzen miteinander multipliziert werden die Regeln für die Matrix-Multiplikation angewandt
  • Dies gilt auch für <Matrix>*<Vektor>
%Lösung eines linearen Gleichungssystems ( A*x = b)
x=inv(A)*b

Zusammenfügen von Matrizen

Das Zusammenfügen von 2 Matritzen geht analog zur Definition.

  • Zeilenweise:
A = [a,a]
  • Spaltenweise:
A = [a; a]

Indizierung von Matritzen

Für die folgenden Beispiele benutzen wir folgende Matrix:

A = magic(4)

Ausgabe:

A = 4×4

    16     2     3    13
     5    11    10     8
     9     7     6    12
     4    14    15     1

Indizierung von Matritzen

Einzelne Elemente der Matrix sind über Indizes zugreifbar

A(4,2) % Zeile 4 Spalte 2 -> 14

Über die gleiche Art und Weise lassen sich auch einzelne Elemente verändern

A(4,5) = 17 % Zeile 4 Spalte 5

Da die Matrix nur 4 Spalten hat wird die Matrix erweitert:

A = 4×5

    16     2     3    13     0
     5    11    10     8     0
     9     7     6    12     0
     4    14    15     1    17

Teilmatrizen

Über Anfang:Ende lässt sich ein Teilbereich von einer Matrix ausgeben/setzen

A = 4×5
<span style="color:#ae81ff">16</span>     <span style="color:#ae81ff">2</span>     <span style="color:#ae81ff">3</span>    <span style="color:#ae81ff">13</span>     <span style="color:#ae81ff">0</span>
 <span style="color:#ae81ff">5</span>    <span style="color:#ae81ff">11</span>    <span style="color:#ae81ff">10</span>     <span style="color:#ae81ff">8</span>     <span style="color:#ae81ff">0</span>
 <span style="color:#ae81ff">9</span>     <span style="color:#ae81ff">7</span>     <span style="color:#ae81ff">6</span>    <span style="color:#ae81ff">12</span>     <span style="color:#ae81ff">0</span>
 <span style="color:#ae81ff">4</span>    <span style="color:#ae81ff">14</span>    <span style="color:#ae81ff">15</span>     <span style="color:#ae81ff">1</span>    <span style="color:#ae81ff">17</span>

A(1:3,2)

Ausgabe:

ans = 3×1
 2
11
 7

Mit einem einzelnen :, ohne Anfang und Ende, lässt sich auf die komplette Zeile/Spalte zugreifen

Eingabe:

A(3,:)

Ausgabe:

ans = 1×5
 9     7     6    12     0

4.3 - MatLab Kontrollstrukturen

if, for, while

Lessons Learned

In diesem Kapitel geht es darum folgende Dinge zu verstehen und zu können

  • Wie funktioniert eine Auswahl
    • if
    • switch-case
  • Wie funktionieren Schleifen
    • for
    • while

Auswahl (Selektion)

nassi

Auswahl (Selektion)

In einem Matlab Skript kann abhänig von einem Kriterium eine Entweder-oder-Entscheidung getroffen werden

D.h. ENTWEDER einen Programmteil “A” ausführen ODER einen anderen Programmteil “B”

An einem Beispiel lässt es sich leicht nachvollziehen:

%...
if (note < 5)
    disp("Bestanden");
else
    disp("Durchgefallen");
end
disp("Verzweigung beendet");

…else…

Der else-Teil ist nicht zwingend erforderlich. Benötigt man die Meldung “Durchgefallen” nicht, kann man auch schreiben:

%...
if (note < 5)
    disp("Bestanden");
end
disp("Verzweigung beendet");

Dies nennt man “Einseitige” Auswahl im Gegensatz zur “Zweiseitigen” Auswahl.

Auswahl (Selektion)

nassi

…else(only)…

Wenn wir umgekehrt den if-Zweig („ja-Zweig“) weglassen und nur den else-Zweig („nein-Zweig“) implementieren wollen, wird es etwas schwieriger.

if (note < 5) % kein guter Stil
else
    disp("Durchgefallen");
end
disp("Verzweigung beendet");

Dies ist jedoch ausgesprochen schlechter Stil! Besser: Wir kehren die Bedingung um.

if (note >= 5)
    disp("Durchgefallen");
end
disp("Verzweigung beendet");

Bedingungen

Was steht eigentlich als Bedingung in den Klammern?

  • Darin steht das Ergebnis der Vergleichsoperation note < 5.
  • Das Ergebnis ist ein Wahrheitswert.
  • Ein Wahrheitswert kann nur die Werte wahr (true) oder falsch (false) annehmen.

Boolean (Not!)

Matlab kennt Wahrheitwerte nicht als Variablentyp. Daher wird jeder Wert einer Variablen grundsätzlich als true interpretiert. Es gibt die Funktion logical() um eine logische Auswertung zu erzwingen. Die einzige Ausnahme ist 0.

In Matlab gilt:

matlab Boolsche Logik
logical(1) true
logical(0) false

Vergleichsoperatoren

a=5;
b=a==4;disp(b); % ergibt false für a = 5
c=a==a;disp(c); % ergibt immer true
  • Der Gleichheitsoperator besteht aus zwei Ist-Gleich-Zeichen, da das einzelne Ist-Gleich-Zeichen schon vom Zuweisungsoperator belegt ist.
  • Ein häufiger Fehler ist, statt dem Gleichheitsoperator „==“, den Zuweisungsoperator „=“ zu benutzen!
  • Diese Verwechslung kann schwer auffindbare Fehler bescheren.

Vergleichsoperatoren

Operator Funktion
== prüft auf Gleichheit
~= prüft auf Ungleichheit
>, >= größer bzw. größer gleich
<, <= kleiner bzw. kleiner gleich

Logische Operatoren

Um mehrere Bedingungn miteinander zu verknüpfen benötigt man logische Operatoren. Die wichtigsten sind:

Operator Funktion
&& UND
││ ODER
~ NICHT
xor eXklusives-Oder
  • a && b ist true, falls a und b true sind.
  • a || b ist true, falls a oder b true ist.
  • a xor b ist true, falls a und b nicht die gleichen Werte haben (xor-Operation).

Operatorhierarchie

+ - * / < > <= >= == ~= ~ && || xor

Für diese Operatoren muss eine eindeutige Abarbeitungs-Reihenfolge gelten.

⇒ Die „Punkt- vor Strichrechnung“ wird zu einer Operatorhierarchie erweitert! (Vorrang nimmt ab)

  1. ~ - (Vorzeichen)
  2. * /
  3. + -
  4. < > <= >=
  5. == ~=
  6. xor
  7. &&
  8. ||

if-else Kaskade

Es kann passieren, dass es mehr als zwei Fälle gibt, die unterschiedlich behandelt werden müssen.

In diesem Fall schachtelt man mehrere if-Anweisungen ineinander und erhält eine sogenannte if-else-Kaskade.

if (note == 1) 
    disp("sehr gut");
elseif (note == 2) 
    disp("gut");
elseif (note == 3)
    disp("befriedigend");
elseif (note == 4)
    disp("ausreichend");
elseif (note == 5)
    disp("mangelhaft");
else
    disp("Fehler im Programm");
end

Mehrfachauswahl

In allen neueren Sprachen, gibt es eine Verzweigung, die, abhängig von einer Integer-Variablen, einen von mehreren Programmblöcken anspringt.

Die if-else-Kaskade ist ein Beispiel dafür. Für dieses Sprachenelement gibt es auch ein entsprechendes

Struktogramm: switch

Die switch-Anweisung

In anderen Sprachen ist die switch-Anweisung auch als case- oder select-Anweisung bekannt.

Die Anweisung beginnt in der ersten Zeile mit dem Schlüsselwort switch, gefolgt von der Variablen, dessen Wert für die Verzweigung verwendet wird.

switch note

Es folgt für jede Note ein case-Block. Er besteht aus dem Schlüsselwort case, gefolgt von dem Wert, für den der Block ausgeführt werden soll

 case 1

Es folgen die Anweisungen für den Block, ohne geschweifte Klammern.

Die switch-Anweisung

switch (note)
    case 1
        disp("sehr gut");
    case 2
        disp("gut");
    case 3
        disp("befriedigend");
    case 4
        disp("ausreichend");
    case 5
        disp("mangelhaft");
    otherwise
        disp("Fehler.");
end % switch

Der otherwise-Block ist optional und wird nur ausgeführt, wenn kein anderer case ausgeführt wurde.

Grenzen von switch

Um Bereiche für einen bestimmten Fall festzulegen muss man die if-else-Kaskade nutzen.

if (windgeschwindigkeit <= 2) 
    disp("Windstille");
elseif (windgeschwindigkeit <= 45) 
    disp("schwacher Wind");
elseif (windgeschwindigkeit <= 75)
    disp("starker Wind");
elseif (windgeschwindigkeit <= 120)
    disp("Sturm");
elseif (windgeschwindigkeit <= 200)
    disp("Orkan");
else
    disp("Messgeraet kaputt, weil Wind zu stark");
end

Schleifen (Iterationen)

Beispiel zur Einführung

Es soll ein Programm geschrieben werden, das einen Countdown simuliert. Es sollen nacheinander die Werte von 10 bis 0 auf dem Bildschirm ausgegeben werden.

Mit bisherigen Mitteln:

disp(10);
disp(9);
disp(8);
% ...
disp(1);
disp(0);

-> Es werden 11 fast gleiche Zeilen ausgeführt.
-> Wir brauchen etwas wie:Führe die Zeile disp(i) nacheinander mit i = 10, 9, 8, …, 1, 0 aus.

Zählschleife

  • Die Zählschleife ist die häufigste Schleifenvariante.
  • Bei der Zählschleife steht von Anfang an fest, wie viele Wiederholungen der Schleife ausgeführt werden.
  • Es gibt einen Zähler (Laufvariable) der von einem Anfangswert bis zu einem Endwert läuft.
  • Der Zähler ändert sich bei jedem Durchlauf um einen festen Betrag.

Zählschleife

Struktogramm

for

Alternative:

for

for-Schleife

Zählschleifen werden mit dem Schlüsselwort for eingeleitet.

for i=10:1:20
    disp(i);
end

Dem Schlüsselwort folgt eine Parameterliste, die in einer runden Klammer zusammengefasst ist. Sie besteht aus 3-4 Teilen, die jeweils getrennt sind:

  1. Initialisierung der Laufvariablen gefolgt von einem =
  2. Startwert für die Laufvariable
  3. Veränderung der Laufvariablen (Schrittweite) (optional)
  4. Endwert

for-Schleife

Das folgende Flussdiagramm veranschaulicht die Reihenfolge der Abarbeitung:

for Flussdiagramm

Wie würde unser Countdown-Programm aussehen?

Countdown mit for


for i=10:-1:0
    disp(i);
end

Änderung der Laufvariablen

Es ist möglich, die Laufvariable im Schleifenkörper zu ändern.

Beispiel:

for i=10:-1:0
    i = i - 2;
    disp(i);
end
  • Diese Änderung ist aber nicht persistent und wird bei der nächsten Iteration wieder rückgängig gemacht.
  • Damit verschiebt sich der Start und Endwert der Schleife.
  • In anderen Programmiersprachen (z.B. Pascal) ist das verboten.
  • In Matlab ist dies schlechter Programmierstil!

While-Schleife

  • Bei manchen Schleifen steht die Anzahl der Durchläufe zu Beginn noch nicht fest.
  • Beispielsweise gibt es mehrere Abbruchbedingungen oder die Laufvariable kann ihre Werte unvorhersehbar verändern.

⇒ Man verwendet eine kopfgesteuerte Schleife.

Kopfgesteuerte Schleife:


while( Bedingung ) 
    Anweisungsblock
end

Der Anweisungsblock wird ausgeführt, solange die Bedingung true ist.

Struktogramm:

while Nassi

Beispiel


found=false;
counter=0;
while (~found && counter<5)
    counter=counter+1;
    zufall=round(6*rand(1)); % Erzeugen der Zufallszahl
    found=(zufall==4);
    disp('counter = '+counter+' Zufallszahl gerundet: '+zufall);
end

Was macht dieses Programm ?

forwhile

for-Schleifen sind nur eine Kurzform für while-Schleifen!

for i=0:2:10
    disp(i);
end;
i=0
while (i<=10)
    disp(i);
    i+=2;
end

for- und while-Schleifen lassen sich immer gegenseitig umwandeln.

Grundregel: for-Schleifen werden nur bei wirklichen Zählschleifen eingesetzt, ansonsten werden kopfgesteuerte Schleifen benutzt!

Verschachtelte Schleifen

Es ist möglich auch mehrere Schleifen zu verschachteln:


for i = 0:2:10
    out = "";
    for j = 0:1:i
        out = out + "*";
    end;
    disp(out);
end;

Ausgabe:


**
****
******
********
**********

4.3 - MatLab Input/Output

Dateien lesen und schreiben

Zur Erinnerung

Eines der häufig genutzten Austauschformate für Daten ist CSV:

LastName,Gender,Age,Height,Weight,Smoker
Smith,M,38,71,176,1
Johnson,M,43,69,163,0
Williams,F,38,64,131,0
Jones,F,40,67,133,0
Brown,F,49,64,119,0

Diese Datei wird für alle folgenden Beispiele verwendet. Wir nehmen an, dass die Datei im gleichen Verzeichnis wie die Beispiel-Programme gespeichert sind und den Dateinamen Daten.csv hat.

readtable()

Tabellarisch strukturierte Daten können mit readtable() eingelesen werden

T = readtable("Daten.csv")

Ausgabe:

T=5×6 table
     LastName     Gender    Age    Height    Weight    Smoker
    __________    ______    ___    ______    ______    ______

    'Smith'        'M'      38       71       176        1   
    'Johnson'      'M'      43       69       163        0   
    'Williams'     'F'      38       64       131        0   
    'Jones'        'F'      40       67       133        0   
    'Brown'        'F'      49       64       119        0  

Zugriff auf eingelesene Inhalte

Grundsätzlich verhalten sich Tabellen in Matlab wie Matrizen, bieten aber einen einfacheren Zugriff auf einzelne Spalten:

 T(:,3)

ans =

5×1 table

Age
___

<span style="color:#ae81ff">38</span> 
<span style="color:#ae81ff">43</span> 
<span style="color:#ae81ff">38</span> 
<span style="color:#ae81ff">40</span> 
<span style="color:#ae81ff">49</span> 

T.Age

ans =

<span style="color:#ae81ff">38</span>
<span style="color:#ae81ff">43</span>
<span style="color:#ae81ff">38</span>
<span style="color:#ae81ff">40</span>
<span style="color:#ae81ff">49</span>

Zu beachten ist das in der linken Variante die Überschrift noch Teil der Daten ist.

readtable()-Optionen

readtable() verarbeitet neben dem eigentlichen Dateinamen Optionen, die als name und wert angegeben werden:

function table=readtable(filename,name,wert)
  • Damit lassen sich Anpassungen im csv-Format einstellen
  • Es können auch mehrere Parameter angegeben werden
table=readtable("Daten.csv","Delimiter"," ") % Wenn die Daten mit einen ' ' statt ',' getrennt sind
table = readtable("Daten.csv",...% Durch ... ist es möglich einen Befehl in der nächsten Zeile fortzusetzen
    "Delimiter"," ","ReadVariableNames",false) % Setzt Delimiter=' ' und ReadVariableNames=false

ReadVariableNames sorgt dafür, dass die Spaltenüberschriften nicht eingelesen/abgespeichert werden. Stattdessen heißen die variablen dann Var1, Var2, Var3 bis VarN.

Liste der Format-Parameter

Parameter-Name Standard-Wert
Delimiter {','}
Whitespace ‘\b\t '
LineEnding {'\n’ ‘\r’ ‘\r\n’}
CommentStyle {}
ConsecutiveDelimitersRule ‘split’
LeadingDelimitersRule ‘keep’
EmptyLineRule ‘skip’
Encoding ‘UTF-8’
ReadVariableNames true

Inhalt festlegen

Normalerweise versucht Matlab selbstständig den Datentyp des eingelesenen Inhalts zu bestimmen. Dieser lässt sich aber auch über den Parameter Format festlegen:

function T = readtable(filename,'Format','%s%s%u%f%f%s')
  • %s : String (char)
  • %u : Positive Ganzzahl (uint32)
  • %f: Fließkommazahl (double)

Eine Beispielzeile der eingegebenen Datei könnte z.B. so aussehen:

Klaus, Mustermann, 32, 1034.21, 37.5, IT-Abteilung

Weitere Infos:

Weitere Informationen und Beispiele unter:

https://de.mathworks.com/help/matlab/ref/readtable.html

Output

Analog zum Einlesen von Dateien gibt es auch eine Funktion writetable() zum Erzeugen von Dateien

writetable(T,"myData.csv");

Auch hier gibt es wieder einige Einstellungen

Liste der Format-Parameter

Parameter-Name Beispiel-Wert
Delimiter ‘,’
WriteRowNames true
QuoteStrings true
Encoding ‘UTF-8’
DateLocale ‘de_DE’

Tabellen erzeugen

  • Um aus den Berechneten Daten eine Tabelle zu erzeugen, gibt es die Funktion table.
  • Diese bekommt die einzelnen Spaltenvektoren übergeben
t=table([1;2;3],["eins";"zwei";"drei"])

Erzeugt:

t =

  3×2 table

    Var1     Var2 
    ____    ______

     1      "eins"
     2      "zwei"
     3      "drei"

Tabellen erzeugen

Sollen die Variablen Namen gesetzt werden müssen die Spalten vorher auf Variablen gespeichert werden

zahlen=[1;2;3];
worte=["eins";"zwei";"drei"];
t=table(zahlen,worte);
disp(t)

Ausgabe:

    zahlen    worte 
    ______    ______

      1       "eins"
      2       "zwei"
      3       "drei"

Weitere Infos:

Weitere Informationen und Beispiele unter:

https://de.mathworks.com/help/matlab/ref/writetable.html