Komplexere Datentypen: Array, String und formatierte Ausgaben

Einführung und Lernziele

Bisher haben wir vier verschiedene Datentypen kennengelernt:

  • Integer: ganze Zahlen

  • Float: Fließkommazahlen

  • String: Zeichenketten

  • Bool (Logical): Wahrheitswerte, d.h. wahr oder falsch

Damit können wir einzelne Objekte der realen Welt ganz gut abbilden. Mit einem String können wir den Namen einer Person erfassen, mit einem Integer das Alter der Person und mit einem Float die Körpergröße der Person gemessen in Meter. Mit einem Bool können wir beispielsweise erfassen, ob die Person zur Klausur zugelassen ist oder nicht. Was uns aber bisher fehlt ist, eine Sammlung von Namen oder eine Sammlung von Körpergrößen verwalten zu können.

Daher werden wir uns in diesem MATLAB Live Skript mit komplexeren Datentypen beschäftigen. Wir werden zunächst den Datentyp Array behandeln. Nachdem wir Eigenschaften diesen Datentyps betrachtet haben, werden wir das Thema String erneut aufgreifen. Zuletzt beschäftigen wir uns noch mit formatierten Ausgaben, um Zahlen und Texte schöner bzw. spezifischer anzeigen zu lassen.

Datentyp Array

In der Mathematik gibt es den Begriff des Vektors. Einen Vektor kann man als eine Zusammenfassung von Zahlen interpretieren. Beispielsweise fasst ein Vektor wie \(\vec{x}=(1.5, -2, 3)\) die Koordinaten eines Punktes zusammen. Oder in der Farbenlehre wird mit mit dem RGB-Wert (116, 144, 199) ein schönes Blau beschrieben (siehe https://www.color-hex.com/color/7490c7). Dabei stehen die drei Komponenten für die Farbanteile rot – grün – blau. Wir können aber auch eine Namensliste mit den Mitgliedern einer WG führen, z.B. [“Alice”, “Bob”, “Charlie”]. Damit verlassen wir die mathematische Welt der Zahlen und damit des Vektors, aber dennoch sind solche Listen für die Verarbeitung von Daten sehr wichtig. Wir brauchen daher einen verallgemeinerten Begriff eines Vektors, also ein Array.

**In der Informatik wird ein Datentyp als Array bezeichnet, der andere Daten vom gleichen Datentyp zusammenfasst. **

Die bisherigen Beispiele waren eindimensional, weil nur eine Eigenschaft benutzt wurde. Im ersten Beispiel die Eigenschaft Koordinate, im zweiten Beispiel die Eigenschaft Farbanteil und im dritten Beispiel die Eigenschaft Name. Im Alltag benutzen wir häufig zweidimensionale Sammlungen von Daten. Wenn Sie im Busfahrplan nachsehen wollen, wann der nächste Bus fährt, kommt es nicht nur auf die aktuelle Uhrzeit, sondern auch auf den Wochentag an. Wenn Sie ein Haushaltsbuch mit Einnahmen und Ausgaben führen wollen, werden Sie vielleicht in Excel eine Tabelle anlegen. In jeder Zeile steht der Posten (Miete, Handykosten, Essen, etc. ) und in den Spalten die Monate Januar, Februar, etc. Wenn die Informationen Zahlen sind, dann werden sie als Matrix dargestellt, z.B. als

\(A = \pmatrix{ 1 & 2 & 0 \cr -3& 1 & 0 \cr 2 & 0 & -1}\).

Jedoch ist auch die Einschränkung auf Zahlen nur für die Mathematik gegeben. In der Informatik können wir in solchen Tabellen auch andere Datentypen benutzen. Beispielsweise könnten die WG-Bewohner einen Putzplan vereinbaren:

\(\pmatrix{& \text{MO} & \text{DI} & \text{MI} \cr \text{Klo putzen} & \text{Alice} & \text{Bob} & \text{Charlie} \cr \text{Abwasch} & \text{Bob} & \text{Charlie} & \text{Alice} }\)

Dieser Putzplan ist zweidimensional, denn wir haben zum einen die Eigenschaft Wochentag und zum anderen die Eigenschaft Putzaktion.

Im Folgenden werden wir die Erzeugung von eindimensionalen und zweidimensionalen Arrays behandeln und lernen, wie man die Einträge in die Arrays manipuliert und ausliest.

Erzeugung von eindimensionalen Arrays

Ein Array wird in MATLAB durch eckige Klammern [  ] erzeugt. Sie finden das Zeichen für die eckige Klammer auf der Taste mit der 8, das Zeichen für die eckige Klammer auf der Taste mit der 9. Zusätzlich müssen Sie die Taste Alt Gr drücken, um die eckigen Klammern auf der Tastatur einzugeben.

Betrachten wir ein Beispiel. Hier wird ein Array mit den Elementen 1, 2, 3, 4, 5 (die Gemeinsamkeit ist, dass alles ganze Zahlen, also Integer sind) erzeugt und dann anschließend in der Variablen array_beispiel gespeichert. Mit der Funktion disp() lassen wir den Inhalt des Arrays ausgeben.

array_beispiel = [1, 2, 3, 4, 5];
disp(array_beispiel);

Mit dem Befehl whos können wir den Datentyp anzeigen lassen.

whos array_beispiel

Sie sollten in der Ausgabe jetzt Folgendes sehen:

_images/part04_whos_array.png

Interessant ist dabei die Eigenschaft Size, die 1x5 anzeigt.

Aber warum zeigt MATLAB eine Size von 1x5 an und was ist das überhaupt? MATLAB ist die Abkürzung für Matrix Laboratory, also Matrix-Labor auf deutsch. Daher speichert intern MATLAB alles als eine Matrix. Sogar eine simple Zahl wie beispielsweise 3 wird von MATLAB als eine Matrix abgespeichert, mit einer Zeile und einer Spalte. Size gibt dabei die Dimension der Matrix an. Die erste Zahl steht für die Anzahl der Zeilen und die zweite Zahl für die Anzahl der Spalten. Zusammengefasst hat unser array_beispiel also eine Zeile und fünf Spalten.

Vergewissern wir uns noch einmal mit der simplen Zahl 3, die ja dann als Matrix mit einer Zeile und einer Spalte abgespeichert werden müsste, was das whos Kommando anzeigt:

x = 3;
whos x

Tatsächlich, Size = 1x1 wird ausgegeben.

Exercise 24

Erzeugen Sie ein Array mit den Elementen 2, 4, 6, 8, 10. Lassen Sie anschließend die Dimension des Arrays ausgeben.

Ein Array speichert jedoch nicht nur Zahlen (Integer/Float), sondern man kann auch die anderen Datentypen in Form einer Sammlung speichern. Im nächsten Code-Beispiel sehen wir eine Namensliste und eine Liste mit dem Status “zur Klausur zugelassen?”.

namen = ["Alice", "Bob", "Charlie", "Dora", "Emil"];
zulassung = [false, true, true, true, false];

disp(namen)
disp(zulassung)

Exercise 25

Erzeugen Sie ein Array mit den Namen der Wochentage. Erzeugen Sie dann ein zweites Array mit der Anzahl an Semesterwochenstunden (Schulstunden), die Sie an diesem Wochentag haben. Lassen Sie beides zur Kontrolle anzeigen.

Erzeugung von zweidimensionalen Arrays

Bisher haben wir eindimensionale Arrays mit einer Zeile und mehreren Spalten erzeugt. Zur Trennung der Elemente in einem Array haben wir bei der Erzeugung das Komma benutzt. Probieren Sie aus, was passiert, wenn wir das Semikolon (= Strichpunkt) dazu benutzen.

array = [1; 2; 3; 4; 5];
disp(array)

Kurze Kontrolle mit dem whos-Kommando:

whos array

Jetzt haben wir ein Array mit 5 Zeilen und 1 Spalte erzeugt!

Halten wir fest:

  • Komma trennt Spalten

  • Semikolon/Strichpunkt trennt Zeilen

Damit können wir auch ein echtes zweidimensionales Array erzeugen. Achten Sie darauf, wie zuerst Kommas kommenund dann immer wieder ein Semikolon.

M = [1, 2, 3, 4, 5; 6, 7, 8, 9, 10; 11, 12, 13, 14, 15];
disp(M)

Und wieder kontrollieren wir mit whos:

whos M

Das Resultat ist ein echtes zweidimensionales Array mit 3 Zeilen und 5 Spalten.

Exercise 26

Erzeugen Sie ein 3x3-Array mit einer Eins auf der Hauptdiagonalen und lauter Nullen ansonsten. Lassen Sie Ihr Array anzeigen.

Kurze Arrays wie beispielsweise eine Auflistung der Wochentage mit sieben Elementen oder die 3x3-Einheitsmatrix können wir schnell händisch erzeugen. Wir werden aber auch noch MATLAB-Methoden kennenlernen, mit denen man nach einem bestimmten Muster Arrays erzeugen kann.

Um Ihnen ein erstes Beispiel zu geben, schauen wir uns jetzt die Funktion randi() an. Die MATLAB-Funktion randi() erzeugt ganzzahlige Zufallszahlen. Dabei gibt es mehrere Argumente:

X = randi( [min, max], zeilenanzahl, spaltenanzahl )

Also produziert X = randi( [1, 100], 1, 3) Zufallszahlen zwischen 1 und 100 in einer Zeile und mit 3 Elementen (Spalten).

X = randi( [1,100], 1,3 );
disp(X)

Weitere Details finden Sie in der MATLAB-Dokumentation: https://de.mathworks.com/help/matlab/ref/randi.html

Exercise 27

Erzeugen Sie ein zweidimensionales Array mit sechs Zufallszahlen, die zwischen 1 und 49 liegen. Lassen Sie das Array auch anzeigen.

Zugriff auf Elemente eines Arrays

Jedes Array hat einen Index. Man kann sich ein Array mit einer Sammlung von Daten wie eine Straße mit einer Sammlung von Häusern vorstellen. Um ein Haus in der Straße zu finden, hat es eine Hausnummer. Und das ist in der Informatik der Index, also die Position im Array, an der ein Element zu finden ist.

Mit dem Index können wir sozusagen nachsehen, welches Element an dieser Index-Position gespeichert ist. Das nennt man in der Informatik Lesezugriff. Oder wir können das Element an einer bestimmten Index-Position gegen ein neues Element austauschen. Das nennt man dann Schreibzugriff.

Um auf ein Element eines Arrays zugreifen zu können (egal ob lesend oder schreibend), verwenden wir runde Klammern und den Index. Wenn wir also beispielsweise das erste Element nachschlagen, also lesen wollen, dann sieht der Lesezugriff für ein eindimensionales Array also so aus:

% Erzeugung des Arrays
a = [11, 22, 33, 44, 55];

% Lesezugriff mit Index 1, also 1. Position
a(1)

Oder auf das dritte Element greifen wir folgendermaßen zu:

a(3)

Natürlich können wir die Elemente eines Arrays wieder in einer Variablen speichern oder sie anzeigen lassen.

a = [11, 22, 33, -77, 55];
viertes_element = a(4);
disp(viertes_element)

Exercise 28

Erzeugen Sie ein Array mit Schnapszahlen, also 11, 22, 33, … , 99. Lassen Sie das dritte, sechste und siebte Element ausgeben.

Wenn wir auf Elemente eines zweidimensionalen Arrays zugreifen wollen, müssen wir wiederum die runden Klammern nutzten. Doch diesmal müssen wir zwei Indizes (=Hausnummern) angeben, nämlich die Zeile und die Spalte.

Bemerkung: es heißt ein Index im Sinular und viele Indizes im Plural.

Erzeugen wir erst einmal eine zweidimensionale Matrix mit zwei Zeilen und vier Spalten, also Dimension/Size 2x4.

A = [11, 22, 33, 44; 
     66, 77, 88, 99];
disp(A)

Das Element in der ersten Zeile und in der zweiten Spalte ist 22.

a_12 = A(1,2);
disp(a_12)

Dahingegen ist das Element der zweiten Zeile und der ersten Spalte 66:

a_21 = A(2,1);
disp(a_21)

Exercise 29

Erzeugen Sie ein zweidimensionales Array

\(\pmatrix{31 & 12 & 43 \cr 11 & 52 & 63\cr 21 & 32 & 13}\)

Lassen Sie alle Elemente der 1. Spalte ausgeben.

Datentyp Character Array und String

Es wäre schön, die Ausgabe noch etwas schöner zu machen. Bisher haben wir nur die Möglichkeit, den Wert einer Variablen oder einen String mit der disp() Funktion anzeigen zu lassen. So lassen wir den Wert von Pi ausgeben:

disp(pi)

Einen String geben wir folgendermaßen aus:

disp("Hallo!")

Sicherlich ist Ihnen schon aufgefallen, dass die input()-Funktion oder die disp()-Funktion auch Texte anzeigen, die zwischen zwei einfachen Hochkommata stehen und nicht durch Gänßefüßchen eingeschlossen sind.

disp('Hallo!')

Was ist denn eigentlich der Unterschied zwischen einfachen und doppelten Hochkommas? Wenn wir doppelte Hochkommata verwenden, so handelt es sich um den Datentyp String. Das andere Konstrukt mit einfachen Hochkommas ist jedoch ein anderer Datentyp, ein Array von Einzelzeichen, ein sogenanntes Character Array. Den Unterschied sehen wir, wenn wir das whos Kommando anwenden:

string = "Hallo";
character_array = 'Hallo';

whos string
whos character_array

Der String “Hallo”hat die Dimension 1x1, das Character Array ‘Hallo’ hat jedoch die Dimension 1x5 (eine Zeile, fünf Spalten), weil es eine Aneinanderreihung von Zeichen ist. Damit haben wir jetzt auch relativ einfach die Möglichkeit, Texte zu manipulieren. Zuerst greifen wir auf einzelne Zeichen zu:

% Erzeugung Character Array mit Hallo
text = 'Hallo';

% Anzeige 3. Zeichen
text(3)

Nun ersetzen wir das kleine l durch ein großes L:

% Erzeugung Character Array mit Hallo
text = 'Hallo';

% Manipulation 3. und 4. Zeichen
text(3) = 'L';
text(4) = 'L';

% Anzeige gesamter Text
disp(text);

Exercise 30

Erzeugen Sie eine Variable mit einem Character Array, in der Ihr Vor- und Ihr Nachname mit Leerzeichen getrennt steht. Geben Sie zur Kontrolle Ihren Namen aus. In einigen Programmen sind Leerzeichen verboten. Ersetzen Sie daher in einem zweiten Schritt das Leerzeichen durch einen Unterstrich _ , indem Sie das Character Array manipulieren. Lassen Sie das manipulierte Array ausgeben.

Sobald wir mit MATLAB Text einlesen, verarbeiten und ausgeben wollen, stellt sich die Frage, ob man besser ein Character Array oder einen String verwenden sollte. Für kürzere Texte sollte man das Character Array nehmen. Für längere Texte und vor allem, wenn Teile des Textes manipuliert werden sollen, ist der Datentyp String die bessere Wahl. Eine Übersicht zu den Manipulationsmöglichkeiten von Texten finden Sie hier: https://de.mathworks.com/help/matlab/characters-and-strings.html

Formatierte Ausgaben mit “fprintf”

Nun können wir eine Alternative zu disp() betrachten, die sogenannte fprintf()-Funktion. Die Dokumentation finden Sie hier: https://de.mathworks.com/help/matlab/ref/fprintf.html

Der wesentliche Unterschied zu disp() ist, dass wir Text und Zahlen mischen können. Die Basis dafür ist, dass der eigentliche Text ein Array ist und die Aneinanderreihung der einzelnen Zeichen manipuliert wird. Die wichtigste Manipulation ist dabei die Ersetzung von Platzhaltern. Zuerst formulieren wir den gewünschten Text als Character Array und setzen Platzhalter mit einem Prozentzeichen ein, die dann durch Zahlen ersetzt werden.

fprintf('Dies ist ein Text mit Platzhalter %f !!!', 3.5)

Wenn Sie die obige Code-Zelle ausführen, sehen Sie, wie das Prozentzeichen mit dem f durch die Zahl 3.5 erzetzt wurde.

Wenn Sie die Ausgabe kontrollieren wollen, können Sie das folgendermaßen:

  • %f - gibt eine Fließkommazahl (Float) aus.

  • %.2f - gibt eine Fließkommazahl aus, nach dem Punkt steht die Anzahl der Nachkommastellen (hier also 2 Nachkommastellen), es wird gerundet,

  • %e - gibt die wissenschaftliche (Exponential-) Notation aus.

fprintf('Dies ist ein Text mit Platzhalter %.2f !!!', 0.056789);
fprintf('Dies ist ein Text mit Platzhalter %e !!!', 0.056789);

Es kann aber auch sein, dass für den Platzhalter ein String eingesetzt werden soll. Dann muss der Platzhalter durch %s gekennzeichnet werden.

fprintf('Hallo %s, schoen, dass es Dich gibt!', "Gegenueber");

Gerade wenn man mehrere fprintf()-Anweisungen hintereinander ausführt, stellt man schnell fest, dass auch zusätzliche Formatierungsanweisungen wünschenswert sind.

  • \n steht für newline und lässt den Cursor nach der Ausgabe in eine neue Zeile springen

  • \t steht für horizontaler Tabulator und lässt den Cursor zum nächsten Tab-Stopp springen.

fprintf('Liebe Studierende, \nin diesem Text ist ein newline versteckt.')
fprintf('Und außerdem ist hier\tein Sprung zum nächsten Tab-Stopp!')

Mehr Informationen finden Sie in der MATLAB-Dokumentation unter https://de.mathworks.com/help/matlab/matlab_prog/formatting-strings.html im Abschnitt Special Characters.

Exercise 31

Geben Sie \(\pi\) mit dem Text “Pi = …” aus, wobei die Punkte durch \(\pi\) ersetzt werden sollen. Probieren Sie folgende Formatierungen aus:

  • wissenschaftliche Notation

  • Fließkommazahl

  • Fließkommazahl mit 4 Nachkommastellen

  • Fließkommazahl mit 8 Nachkommastellen

  • Fließkommazahl mit 0 Nachkommastellen

Zusammenfassung

In diesem MATLAB Live Skript haben wir uns mit dem Datentyp Array beschäftigt. Tatsächlich ist das nur ein kleiner Einstieg in die Welt der Arrays gewesen, da MATLAB wesentlich auf der Verarbeitung von Arrays basiert. Wir werden in den folgenden Skripten auch immer wieder auf diesen Datentyp zurückgreifen. Aber zunächst vervollständigen wir im nächsten MATLAB Live Skript das Thema Kontrollstrukturen, indem wir die sogenannten Zählschleifen einführen. Die Zählschleifen wiederum bauen auf Arrays auf.