Lektion 4 – Text in MATLAB und cell arrays

In Lektion 4 des MATLAB-Kurses lernen Sie, wie Sie Text verwenden und modifizieren können. Außerdem stelle ich Ihnen den Datentyp cell vor.

Nutzung von Text in MATLAB

Speichern von Strings in Variablen vom Typ char

Text wird in MATLAB  in Variablen vom Typ char gespeichert. Zum Erzeugen einer Variable vom Typ char setzen Sie einfach einen Text zwischen einfache Anführungszeichen ':

>> variableMitText = 'Das ist ein Text.'

variableMitText =

Das ist ein Text.

Im Workspace erscheint daraufhin der Name der Variablen und deren Inhalt:

MATLAB-Workspace mit Variable vom Typ char

Mit der Funktion length(variable) bestimmen Sie die Länge eines Vektors. Da der Typ char in Matlab wie ein gewöhnlicher Vektor behandelt wird, funktioniert der Befehl auch für den Typ char:

>> length(variableMitText)

ans =

    17

Suchen nach Text in Variablen vom Typ char

Wenn Sie nach einem Text in einer bestehenden Variablen vom Typ char suchen wollen, so können Sie dafür den Befehl strfind verwenden. Stellen Sie sich vor, Sie haben den Satz „Peter hat sechs Kinder und zwei Hunde“ und Sie wollen ein MATLAB-Programm schreiben, was automatisch herausfindet, wie viele Kinder Peter hat. Das Programm könnte zunächst nach der Stelle suchen, an der das Wort „Kinder“ beginnt. Anschließend könnte das Programm nach allen Leerzeichen im Text suchen und daraus ableiten, an welcher Stelle die Zahl vor dem Wort „Kinder“ steht. Das Programm kann dann zum Beispiel so aussehen.

Beispiel für strfind:

clc
variable = 'Peter hat sechs Kinder und zwei Hunde';
idKinder = strfind(variable,'Kinder')
idLeerzeichen = strfind(variable,' ')
idLeerzeichen = idLeerzeichen(idLeerzeichen<idKinder)

disp(['Anzahl Kinder: ', variable(idLeerzeichen(end-1)+1:idLeerzeichen(end)-1)])

In Zeile 9 wird über den Befehl strfind die Stelle ermittelt an welcher der Text „Kinder“ in der Variablen variable beginnt. Dies erzeugt folgende Ausgabe:

idKinder =

    17

In Zeile 10 werden die Stellen, an denen Leerzeichen (' ') stehen sind ermittelt. Dies erzeugt folgende Ausgabe:

idLeerzeichen =

     6    10    16    23    27    32

Die Leerzeichen, die nach dem Wort „Kinder“ kommen interessieren uns nicht weiter, deshalb werden sie aus der Variablen idLeerzeichen gelöscht. Dies geschieht in Zeile 11.

In Zeile 13 werden zwei Textteile zu einer Variablen zusammengefasst. Dies geschieht über die Schreibweise text = [text1,text2]. Dies ist möglich, da Matlab Textvariablen intern als Vektoren speichert. Jedem Buchstaben entspricht dabei eine Zahl des Vektors.

Ersetzen von Text

Wenn Sie innerhalb eines Textes A eine Zeichenfolge B durch eine andere Zeichenfolge ersetzen wollen, so können Sie dies über den Befehl strrep erledigen.

Beispiel für strrep:

clc
A = 'Für Datenanalysen empfehle ich Ihnen Excel!'
B = 'Excel';
C = 'MATLAB';
strrep(A,B,C)

Das Beispiel erzeugt folgende Ausgabe:

A =

Für Datenanalysen empfehle ich Ihnen Excel!


ans =

Für Datenanalysen empfehle ich Ihnen MATLAB!

Umwandeln von Zahlen in Text

Zum Umwandeln einer Zahl in einen String können Sie den Befehl num2str verwenden:

num2str(1.23135356,3)

gibt die Zahl 1.23135356 mit 3 Stellen aus.

Ausgabe von Text mit sprintf

Mit dem MATLAB-Befehl sprintf können Sie formatierte Textausgaben erzeugen. Nehmen wir an, Sie haben den Zahlenwert des Ergebnisses einer Berechnung in der Variablen ergebnis (Typ double) abgelegt. Eine Ausgabe könnte dann etwa so aussehen:

clc
ergebnis = 1242/234
sprintf('Das Ergebnis ist %.2f!\n',ergebnis)

Dies erzeugt folgende Ausgabe:

ans =

Das Ergebnis ist 5.31!

In Zeile 28 wird der Befehl sprintf verwendet. Das erste Argument ist der auszugebende Text mit Platzhaltern für einzufügende Variablen. In diesem Fall habe ich den Platzhalter %.2f zur Erzeugung einer Zahlendarstellung mit 2 Nachkommastellen verwendet. Folgende Platzhalter benötige ich oft in meiner Arbeit:

Darstellungstyp Platzhalter Beispiel Ausgabe
Fließkommazahl mit m Nachkommastellen %.mf sprintf('Pi = %.5f',pi) Pi = 3.14159
Fließkommazahl mit m Nachkommastellen und Exponent %.me c = 299792458;sprintf('c = %.3e',c) c = 2.998e+08
Text %s n = 'Hase';sprintf('Stumpfe Nase -> %s',n) Stumpfe Nase -> Hase

Wie Sie im vorherigen Beispiel gesehen haben, erschien vor der eigentlichen Ausgabe der Text ans = . Wenn Sie diesen Text nicht ausgeben wollen, so können Sie den Text, der von sprintf erzeugt wird in einer Variablen speichern und die Ausgabe des Texts durch ein Semikolon nach dem Befehl verhindern. Den Text können Sie dann über den Befehl disp ausgeben. Diese Variante sehen Sie im folgenden Beispiel:

clc
haeufigkeit = 'täglich';
tier = 'Murmeltier';

text = sprintf('Das Ergebnis ist %0.2f!\n',ergebnis);
text = [text,sprintf('Und %s grüßt das %s',haeufigkeit,tier)];
disp(text)

Cell Arrays (Datentyp cell)

Der MATLAB-Datentyp cell erlaubt das Speichern von beliebigen Daten in Feldern beliebiger Dimension. Eine Variable vom Typ cell kann dabei mehrere verschiedene Datentypen enthalten.

Erzeugen von Cell Arrays

Das folgende Beispiel erzeugt eine Variable vom Typ cell (cell array), deren Inhalt ein Vektor, ein Text, eine einzelne Zahl sowie eine Matrix ist:

clear
clc
mein_Array = {[1 2 3],'Hallo';pi,[5 6;7 8]}

Zugriff auf Cell Arrays

Für den Zugriff auf cell arrays gibt es in MATLAB grundsätzlich zwei verschiedene Möglichkeiten:

  1. Zugriff auf einen Teil des cell arrays und Ausgabe als neues cell array
  2. Zugriff auf den Inhalt einzelner Einträge des cell arrays

Im folgenden Beispiel werden diese beiden Möglichkeiten demonstriert:

ausgabe_1 = mein_Array(2,2)
ausgabe_2 = mein_Array{2,2}

Zeile 43 erzeugt aus der 2. Zeile und 2. Spalte des cell arrays mein_Array ein neues cell array. Im Workspace wird der Typ cell angezeigt.

Zeile 44 greift auf den Inhalt der 2. Zeile und 2. Spalte des cell arrays zu. Der Typ der Ausgabe ist eine 2×2 Matrix.

Anwenden von Funktionen auf Elemente eines Cell Arrays (cellfun)

Mit der MATLAB-Funktion size können Sie die Größe von Variablen ermitteln. Die Funktion funktioniert sowohl für Matrizen als auch für cell arrays. Zur Ermittlung der Größe des cell arrays mein_Array verwenden Sie folgenden Code:

size(mein_Array)

Dies erzeugt die folgende Ausgabe:

ans =

     2     2

Zum Ermitteln der Größe der Inhalte der einzelnen Einträge des cell arrays mein_Array muss der Befehl size auf alle Einträge angewandt werden. Hierfür gibt es die MATLAB-Funktion cellfun. Sie wendet einen Befehl auf alle Einträge eines cell arrays an und gibt das Ergebnis wieder in einem cell array aus. Mit dem folgenden Code ermitteln Sie die Größen der Einträge des cell arrays mein_Array:

groesse_Inhalt = cellfun(@size,mein_Array,'UniformOutput',false);
groesse_Inhalt{1,1}
groesse_Inhalt{1,2}
groesse_Inhalt{2,1}
groesse_Inhalt{2,2}

Dies erzeugt die folgende Ausgabe:

ans =

     1     3


ans =

     1     5


ans =

     1     1


ans =

     2     2

Der Parameter 'UniformOutput',false in Zeile 50 muss immer dann verwendet werden, wenn die Ausgabewerte nicht die gleiche Form haben, d.h. wenn sie sich in Typ oder Größe unterscheiden. Wenn Sie den Parameter zunächst vergessen, erscheint in MATLAB eine Fehlermeldung, die Sie dazu auffordert, den Parameter hinzuzufügen.

Text in Cell Arrays

Es ist häufig praktisch mehrere Variablen vom Typ char in einem cell array zusammenzufassen. Hierbei kann es sich zum Beispiel um die Einträge der einzelnen Zeilen aus einer Spalte einer Excel-Tabelle handeln. Stellen Sie sich beispielsweise vor, Sie wollen aus einer Liste von durch ein Leerzeichen getrennten Vornamen und Nachnamen die Vornamen und die Nachnamen jeweils in eine einzelne Liste überführen. In dem folgenden Beispiel erzeuge ich die Liste der Namen in Matlab, sie könnten aber ebenso aus einer anderen Datenquelle stammen.

clc
namen = ...
{'Hans Schmidt';'Peter Müller';'Karl Zobel';'Walter Krumm'};
idLeer = strfind(namen,' ');
vornamen = cellfun(...
@(x,y)x(1:y-1),namen,idLeer,'uniformoutput',0)
nachnamen = ...
cellfun(...
@(x,y)x(y+1:end),namen,idLeer,'uniformoutput',0)

In Zeile 30 habe ich den Befehl strfind auf das gesamte Cell Array namen angewandt. Die Ausgabe ist ein Cell Array mit den Positionen der Leerzeichen in den einzelnen Einträgen des Cell Arrays.
In Zeile 61 wende ich die im Cell Array idLeer gespeicherten Leerzeichenpositionen an um über die Funktion cellfun aus allen Namen die Vornamen zu extrahieren.
In Zeile 63 mache ich das Gleiche für die Nachnamen.
Viele Befehle zur Verarbeitung von Text unterstützen die Verarbeitung von Cell Arrays, die wiederum Text enthalten.

Anwendungsbeispiel: Finden eines Namens in einer Liste

Das folgende Anwendungsbeispiel zeigt, wie Sie in einer Liste von Namen alle Einträge mit einem vorgegebenen Vor- oder Nachnamen findet und anschließend die gefundenen Einträge ausgeben:

namen = ...
{'Hans','Schmidt';'Peter','Müller';'Karl','Zobel';...
'Walter','Krumm';'Hanna','Schmidt'};

gesucht = input('Vor- oder Nachname: ','s');
idGefunden = strcmp(namen,gesucht);
reihe = max(idGefunden,[],2)==1;
if sum(reihe)>0
gefiltert = cellfun(@(x)x,namen(reihe,:),...
'UniformOutput',false);
vornamen = gefiltert(:,1);
nachnamen = gefiltert(:,2);
antwort = cellfun(@(x,y)sprintf(...
'gefundener Vor- und Nachname: %s %s\n',x,y),...
vornamen,nachnamen,'UniformOutput',false);
disp(strjoin(antwort,'\n'))
else
disp('Kein Eintrag gefunden.')
end

In Zeile 73 wird der Variablen gesucht über den Befehl input ein vom Nutzer einzugebender Text zugewiesen. Der Parameter 's' sorgt dafür, dass Matlab die Eingabe als Text und nicht als Matlab-Anweisung interpretiert.
In Zeile 74 werden alle Einträge des Cell Arrays namen mit dem gesuchten Namen verglichen. Schauen Sie sich den Rückgabewert idGefunden in der Kommandozeile oder im Workspace an, es handelt sich um eine logische Indizierung mit dem Wert 1 (oder true) an den Stellen, an denen das Cell Array mit dem gesuchten Namen übereinstimmt.
Zeile 75 sorgt dafür, dass aus den gefundenen Indizes die Reihen (Namen und Vornamen) extrahiert werden.
In Zeile 77 bis 84 wird eine Ausgabe der verschiedenen gefundenen Namen erstellt.
Für den Fall, dass kein entsprechender Name gefunden wurde, wird in Zeile 86 ausgegeben, dass kein entsprechender Name gefunden wurde.
Sollten Sie noch Fragen zu den Beispielen haben, schreiben Sie mir gerne eine Nachricht.

Download der Beispiele

Alle Beispiele dieser Lektion können Sie hier herunterladen.

Zusammenfassung

Für die Speicherung von Text steht in Matlab der Variablentyp char zur Verfügung.

Zum Suchen nach einem Text innerhalb eines anderen Texts verwenden Sie die Funktion strfind.

Zum Ersetzen eines Texts innerhalb eines anderen Texts verwenden Sie die Funktion strrep.

Die Umwandlung von Zahlen in Text geschieht über die Funktion num2str.

Über die Funktion sprintf können Sie formatierte Ausgaben verschiedener Variablen erzeugen.

Der Datentyp cell kann beliebige andere Datentypen aufnehmen.

Soll eine Funktion auf alle Elemente eines cell arrays angewendet werden, so geschieht dies über die Funktion cellfun.

Quiz

Hier gelangen Sie zu einem kurzen Quiz mit Fragen zu Lektion 4.

Fortsetzung

Hier geht es weiter mit Lektion 5 des MATLAB-Kurses.

Hier gelangen Sie zum Inhaltsverzeichnis von Teil 1.