Navigation

Tag 5: Umgang mit Daten

A) Suchen und Sortieren

Wissenschaftlichen Datenauswertung erfordert es haeufig, Daten nach bestimmten Kriterien zu durchsuchen, um dann nur denjenigen Teil der Daten zur Analyse zu verwenden, fuer den bestimmte Bedingungen erfuellt sind.  Prinzipiell lassen Daten sich sehr gut (und in jeder beliebigen Programmiersprache) mit Hilfe von logischen Operatoren, Fallunterscheidungen und Schleifen durchsuchen. 

Matlab stellt ausserdem ein spezielles Konzept zur Verfuegung, die logische Indizierung. Hierbei wendet man eine Matrix (oder einen Vektor) vom Typ logical als Indizes auf eine Matrix (oder einen Vektor) gleicher Groesse an. Als Ergebnis erhaelt man einen Vektor, in dem nur diejenigen Elemente der urspruenglichen Matrix enthalten sind, die den logischen true in der Index-Matrix entsprechen. Z.B.: a=[1 9 6; -9 7 0]; indi=logical([0 1 0; 1 0 1]); b=a(indi) liefert b=[9;-9;0].

Sehr haeufig erzeugt man die Matrix aus logicals, indem man einen Vergleichsoperator auf die urspuengliche Matrix anwendet. Z.B. ag0=a>0

Speziell zum Suchen stellt Matlab den speziellen Befehl find zur Verfuegung, mit dem man Matrizen nach bestimmten Kriterien durchsuchen kann. find gibt die Indizes derjenigen Elemente eines Vektors oder einer Matrix zurueck, die ungleich 0 sind. Kombiniert man find mit logischen Operationen, lassen sich Daten auch nach komplizierten Mustern sehr effizient durchsuchen (zumindest mit etwas Uebung...). Syntax von find:

  • ind = find(X)    % gibt die Indizes aller Element des Vektors X zurueck, die ungleich 0 sind
  • ind = find(X, k)    % gibt die ersten k Elemente des Vektors X zurueck, die ungleich 0 sind
  • ind = find(X, k, 'last')  % gibt die letzten k Elemente des Vektors X zurueck, die ungleich 0 sind
  • [row,col] = find(M, ...)  % gibt Zeilen- und Spaltenindizes der Elemente der Matrix M zurueck, die ungleich 0 sind.
  • [row,col,v] = find(M, ...)  % gibt Zeilen- und Spaltenindizes, sowie die Werte der Elemente der Matrix M zurueck, die ungleich 0 sind

Es kommt haeufig vor, dass man Daten nicht in der urspruenglichen Reihenfolge belassen moechte, sondern nach bestimmten Kriterien sortieren. Im Prinzip geht auch das "per Hand" mit Fallunterscheidungen und Schleifen - das kann aber schnell ziemlich viel Arbeit werden. Deshalb gibt es in Matlab die beiden praktischen Befehl sort und sortrows. sort sortiert die Daten unabhaengig fuer jede Zeile (oder Spalte) einer Matrix. Bei sortrows wird die Matrix entsprechend einer Spalte sortiert, indem die Zeilen jeweils beibehalten werden.  

  • vs1=sort(v1)   % sortiert die Elemente eines Vektors v1 in aufsteigender Reihenfolge
  • ms1=sort(m,1)  % sortiert die Elemente jeder Spalte der Matrix m in aufsteigender Reihenfolge (unabhaengig voneinander)
  • ms2=sort(m,2)  % sortiert die Elemente jeder Zeile der Matrix m in aufsteigender Reihenfolge (unabhaengig voneinander)
  • msd=sort(m,1,'descend')  % sortiert die Elemente jeder Spalte der Matrix m in absteigender Reihenfolge (unabhaengig voneinander)
  • [ms1,index]=sort(m,1) % gibt zusaetzlich zur sortierten Matrix die Indizes zurueck
  • mr1=sortrows(m1,n)   % sortiert die Zeilen der Matrix m1 gemaess ihren Eintraegen in der n-ten Spalte in aufsteigender Reihenfolge.
  • mdesc1=sortrows(m1,-n)   % sortiert die Zeilen der Matrix m1 gemaess ihren Eintraegen in der n-ten Spalte in absteigender Reihenfolge.
  • mr_n1=sortrows(m1,[n,1])   % sortiert die Zeilen der Matrix m1 gemaess ihren Eintraegen in der n-ten Spalte in aufsteigender Reihenfolge. Bei gleichen Werten in der n-ten Spalte werden diese Zeilen entsprechend der 1. Spalte sortiert.
  • [mr1,index]=sortrows(m1,n)  % gibt zusaetzlich einen Vektor der Indizes zurueck.

Aufgaben:

T5_A1) Probieren Sie logische Indizierung aus:
m=[ 0 1; 5 9; 3 0]
ind_m=logical([0 1; 0 0; 1 0])
m_teil=m(ind_m)
Erzeugen Sie mit logischer Indizierung einen Vektor, der nur diejenigen Elemente von m enthaelt, die groesser als 2 sind.

T5_A2) Probieren Sie den find Befehl aus:
v=[1 7 5 0 8 0 3 1]
ind_ungleich_0=find(v) % Suche der Indizes von Elementen ungleich 0
v_ungleich_0=v(ind_ungleich_0) % Schreibe Werte der Elemente ungleich 0 in einen Vektor
ind_gleich_1=find(v==1) % suche Indizes der Elemente, die gleich sind1

m=[ 0 1; 5 9; 3 0]
[row_not0,col_not0]=find(m) %Matrix-Art des Suchens
lin_ind_not0=find(m) % Suchen mit linearer Indizierung
m_not0=m(lin_ind_not0) %Ausgabe der Elemente ungleich 0 als Vektor
[row_1,col_1]=find(m==1)

Erzeugen Sie mit find einen Vektor, der nur diejenigen Elemente von m enthaelt, die groesser als 2 sind.

T5_A3) Laden Sie folgende Beobachtungsreihe: [fuetterungen.mat]
In dieser Matrix wurden an 31 Tagen eines Monats eingetragen, wie gross die Niederschlagsmenge des Tages in mm war (1. Spalte) und wie oft ein Meisenweibchen sein Nest zum Fuettern angeflogen hat (2. Spalte). Finden Sie heraus:

  • An welchen Tagen dieses Monats ist kein Regen gefallen?
  • An welchen Tagen hat die Meise haeufiger als 50 Mal gefuettert?
  • An welchen Tagen ohne Niederschlag hat die Meise haeufiger als 50 Mal gefuettert?
  • Wie haeufig ist es vorgekommen, dass die Meise an zwei aufeinanderfolgenden Tagen zusammen ueber 100 Mal gefuettert hat?

T5_A4) Sortieren Sie die Matrix fuetterungen einmal nach der Anzahl Fuetterungen und einmal nach der Niederschlagsmenge.

* T5_A5) Falls Sie sich ein Beispiel fuer Suche in Messdaten ansehen wollen, hier ein Beispiel aus dem Fortgeschrittenen-Matlabkurs, bei dem der gleiche Datensatz auf drei verschiedene Arten durchsucht wird: [search_demo.m] benutzt den Datensatz [VP_data.mat]

B) Grafische Darstellung von Daten

Daten graphisch darzustellen ist eine extrem wichtige Aufgabe bei der wissenschaftlichen Datenauswertung. Der wichtigste Befehl hierfuer ist der bereits bekannte plot Befehl. In diesem Abschnitt wollen wir einige zusaetzliche Moeglichkeiten der grafischen Darstellung betrachten.

T5_B1)  Haeufig verarbeitet man mehr Daten als man sinnvoll in einer Abbildung unterbringen kann. Man kann eine Abbildung mit dem Befehl subplot in mehrere kleine Abbildungen teilen. Mit subplot(2,3,5) erzeugt man eine Matrix aus kleinen Abbildungen mit 2 Zeilen und 3 Spalten, wobei das 5. Fenster aktiv ist. In diesem kann der plot-Befehl (und alle dazugehoerigen Formatierungen und Beschriftungen) normal verwendet werden. Um ein anderes der Abbildungsteile zu aktivieren, wird wiederum der Befehl subplot mit der entsprechenden Angabe fuer die aktuelle Nummer genutzt (z.B. subplot(2,3,1)). Machen Sie eine Abbildung bestehend aus 4 subplots, in denen fuer x=-5:0.1:5 die Kurven x.^1 bis x.^4 dargestellt sind. 

T5_B2) Matlab kann auch mehrere Grafikfenster gleichzeitig benutzen. Eine neue Abbildung bekommt man mit figure. Mit figure(1) und figure(2) springt man zwischen den aktiven Fenstern. close(1) schliesst das zuerst erzeugte Fenster, close all schliesst alle Grafikfenster. clf loescht den Inhalt des aktuellen Fensters.
Oeffnen Sie zwei Grafikfenster plotten Sie im fuer den x-Vektor 0.1:0.1:10 im ersten Fenster die Quadratwurzel, im zweiten Fenster das Quadrat von x. Probieren Sie die oben genannten Befehle aus.

 *T5_B3) Kuchengrafiken sind eine beliebte Darstellungsmoeglichkeit fuer Prozentanteile. Um die Stimmenverteilung bei der letzten Wahl (2006) des - heute noch aktuellen - Oldenburger Stadtrates darzustellen, wuerde man z.B. schreiben
prozente=[32.74 25.99 21.24 6.33 7.24 5.44 0.99];
pie(prozente) 

Wenn man es noch etwas huebscher haben moechte, kann man z.B. auch benutzen:

pie3(prozente)
pie(prozente,{'SPD','CDU','Gruene','FDP','Linke','BFO','NPD'})
, oder
pie3(prozente,[0 0 1 0 0 0 0]).

Der Oldenburger Stadtrat hat 50 Sitze. Berechnen Sie die Sitzverteilung (in diesem Fall gab es keine Abweichungen von der aus den Prozentzahlen erwarteten Sitzverteilung) und stellen Sie diese ebenfalls als Kuchengraphik dar.

T5_B4) Wir haben vor einiger Zeit schon mal den Befehl imagesc benutzt, um uns den Inhalt einer Matrix farbkodiert anzeigen zu lassen. Benutzen Sie ihn, um sich die Verteilung einzelliger Algen in einer Petrischale anzusehen, die als Matrix population in [algen.mat] gespeichert ist.
Was bedeuten in dieser Abbildung die beiden Achsen?
In den Vektoren x und y sind Abstaende der Messbereiche in x und y Richtung der Petrischale gespeichert. Mit imagesc(x,y,population) bekommt man aussagekraeftige Achsenbeschriftungen.
Der Befehl colorbar erzeugt eine Legende fuer die Farbkodierung der Werte. 

T5_B5) Dieselbe Algenverteilung laesst sich auch dreidimensional als "Gebirge" darstellen. Der Befehl dafuer ist surf(population).  Um aussagekraeftige Achsen zu bekommen, muss jedem Punkt der Matrix ein x- und ein y-Wert zugeordnet werden (die Werte der Matrix population werden auf der z-Achse aufgetragen). Benutzen Sie dafuer die mit abgespeicherten Matrizen xmatrix und ymatrix. Der Befehl colorbar funktioniert auch hier. Probieren Sie den alternativen Befehl mesh aus. Was ist der Unterschied zu surf?

C) Grafik- und Textformate

Wie wir bereits wissen, speichert Matlab seine Daten standardmaessig als .mat Dateien ab, die ausschliesslich von Matlab selber vernuenftig weiterverarbeitet werden koennen. Haeufig moechte man jedoch Matlab mit anderen Programmen kombinieren, die andere Dateiformate verwenden.

Wir werden uns zunaechst etwas ausfuehrlicher mit verschiedenen Grafik-Formaten beschaeftigen, da diese extrem haeufig gebraucht werden, anschliessend kommen wir kurz zum Einlesen von Text-Dateien und zur Kompatibilitaet mit Excel. Wenn Sie Bedarf an ausfuehrlicheren Informationen zum Im- oder Exportieren bestimmter Dateiformate haben, schauen Sie bitte in der Hilfe nach.

Eine wichtige Voraussetzung zum Verstaendnis von Grafik-Formaten ist die Farbkodierung, mit der man die in einer Grafik genutzten Farben genau festlegen kann. Farben werden in der sogenannten RGB-Kodierung dargestellt, d.h. sie werden durch einen Vektor farbe=[rot gruen blau] definiert. In Matlab werden zur Kodierung fuer rot, gruen und blau Werte zwischen 0 und 1 angegeben,  z.B. ist [1 0 0] rot, [0 0 0] schwarz, [1 1 0] gelb, [0.6 0 0.6] dunkel-violett. So lassen sich beliebige Farben mischen. (s. Aufgabe T5_C1)

Ein wichtiges Grafik-Format ist jpg. jpg-Dateien koennen in Matlab eingeladen und bearbeitet werden. Darin ist jeder Punkt durch einen Vektor von drei Farbwerten kodiert (allerdings etwas unterschiedlich zum in Matlab ueblichen Format). Bei zweidimensionalen Abbildungen ergibt sich also eine 3 dimensionale Matrix der Groesse MxNx3 (M und N ist die Anzahl Pixel in vertikaler und horizontaler Richtung). (s. Aufgabe T5_C2)

Man kann Matlab-Abbildungen abspeichern und erneut in Matlab oeffnen. Die einfachste Moeglichkeit dazu ist, den Menuepunkt ">File >Save as" zu benutzen. Der Standard ist dann, dass die Abbildung mit der Endung .fig abgespeichert wird - dabei handelt es sich um ein Format, was nur von Matlab vernuenftig verarbeitet werden kann, dort aber beim erneuten Einladen alle Eigenschaften der Abbildung beibehaelt.

Wenn man die Abbildungen mit einem anderen Programm benutzen will, z.B. um sie in ein mit Word geschriebenes Protokoll einzubinden, muss man ein anderes Dateiformat benutzen als .fig.  Dazu kann man wie oben beschrieben abspeichern, muss jedoch  das gewuenschte Dateiformat auswaehlen und die Endung der Datei entsprechend anpassen.

Aufgaben:

T5_C1) Stellen Sie den Vektor 0:1:10 mit einer durchgezogenen dunkelroten Linie dar, indem Sie die RGB-Kodierung verwenden.
*) Wenn Sie Lust auf ausgefeilte Grafik haben: Versehen Sie auf der Linie die einzelnen Punkte mit tuerkis gefuellten Kreisen (hierfuer braucht man "line properties", siehe T1_C7).

T5_C2) Schauen Sie sich die Arbeitsweise des Skripts [meisenshow.m] an. Hierzu brauchen Sie ausserdem die Datei [bmeise.jpg]

  • Wie unterscheidet sich die Farbkodierung dieser jpg-Datei von der in Matlab ueblichen?
  • Teilen Sie die Matrix in drei Teile, um sich die Rot-, Gruen- und Blau-Anteile des Bildes einzeln anzusehen.
  • *) Erweitern Sie die Show um eine Meise mit zwei Koepfen.

T5_C3) Erzeugen Sie sich einen plot mit zwei dargestellten Graphen, z.B. zwei Glockenkurven wie am ersten Kurstag. Speichern Sie die Abbildung im Standardformat .fig ab.

  • *) Zoomen Sie in die Abbildung hinein und speichern Sie die Abbildung unter einem anderen Namen wieder ab.
  • Schliessen Sie dann das Grafikfenster und laden die beiden gerade gespeicherten Abbildungen ueber ">File >open" im Hauptmenue ein.
  • Probieren Sie, bei der Abbildung des Ausschnitts wieder den gesamten Graphen zu reproduzieren.

T5_C4) Probieren Sie aus, Ihre in der letzten Aufgabe erzeugte Abbildung als jpg-Datei zu speichern, zu schliessen und wieder mit Matlab zu oeffnen.

  • *) Was muss man tun, um sie sich wieder anzusehen?
  • *) Kann man aus einem Ausschnitt der Kurve wieder zur gesamten Kurve zurueckkommen?
  • *) Probieren Sie aus, sowohl eine Abbildung im .fig Format als auch im .jpg Format in Word zu importieren.

T5_C5) Da man Grafiken meistens sowieso ansehen moechte, bevor man sie abspeichert, bietet sich meistens der Weg ueber die Menueleiste an. In manchen Faellen (z.B. wenn man fuer seine Bachelorarbeit viele gleich formatierte Abbildungen braucht) moechte man jedoch aus einem Skript oder einer Funktion heraus Abbildungen speichern. Hierfuer gibt es den Befehl saveas. Damit dieser Befehl weiss, welche Grafik gespeichert werden soll, muss diese jedoch beim plotten benannt werden. Probieren Sie aus:
x=1:1:100; y=sqrt(x);
h=plot(x,y);
saveas(h,'testbild.fig')
Schliessen Sie die Abbildung und laden Sie testbild.fig neu ein.

Das Praktische an dieser Art des Speicherns ist, dass Matlab direkt verschiedene Formate speichern kann und das gewuenschte Dateiformat an der Endung des Dateinamens erkennt. Unter anderem koennen .jpg, .eps, .pdf und .bmp benutzt werden. (Die gesamte Liste moeglicher Formate und ihrer Endungen findet man in der Hilfe unter saveas.)
*) Probieren Sie, die Abbildung z.B. als bmp abzuspeichern und in Word zu importieren.

T5_C6) Eine haeufig gebrauchte Anwendung ist das Einlesen von Text-Dateien, die mit einem anderen Programm abgespeichert wurden.

a) Wenn es sich bei der Datei ausschliesslich um Zahlen handelt und in jeder Zeile der Datei gleich viele Zahlen enthalten sind, kann man in Matlab den normalen load Befehl verwenden. Erstellen Sie mit einem Textprogramm eine Testdatei testdatei.txt z.B. mit den Eintraegen

5 7 9 13.6

0.5 100 1 17

Speichern Sie sie als TEXT-Datei (NICHT word!) z.B. als testdatei.txt ab und laden Sie sie in Matlab mit A=load('testdatei.txt') ein.

*b) Manchmal hat man Dateien, in denen die numerischen Eintraege durch bestimmte Zeichen getrennt sind. z.B. koennten Sie eine Datei testdatei2.txt haben, die ein Semikolon zum Trennen benutzt:

5; 7; 9; 13.6

0.5; 100; 1; 17

Um diese einzulesen, muss Matlab das Trennzeichen mitgeteilt werden. Hierfuer gibt es die Funktion dlmread (delimited characters read):

A= dlmread('testdatei2.txt',';')

Probieren Sie auch das aus.

* c) Komplizierter ist die Sache, wenn eine Datei gemischte numerische und ASCII Daten enthaelt. Hierfuer gibt es die Funktion textread. Sie basiert darauf, dass man durch eine Abfolge von %s (string) und %f (float Zahlen) das Muster angibt, mit dem jede der Zeilen aufgebaut ist. Schauen Sie sich bei Interesse in der Hilfe an, wie diese Funktion funktioniert und probieren Sie sie aus.

d) Umgekehrt kann man auch mit Matlab den Inhalt von Variablen als Textdateien abspeichern, die sich dann mit einem Texteditor ansehen und mit anderen Programmen weiterverarbeiten lassen. Die Syntax dafuer lautet save dateiname variablenname -ascii. Erzeugen Sie eine Matrix im Workspace, speichern Sie diese als ascii-File ab und sehen Sie sich diese Datei in einem Texteditor an. Wie sieht eine dreidimensionale Matrix aus?

* T5_C7)  Speziell fuer Nutzerinnen und Nutzer von Excel: Matlab kann excel-Dateien einlesen mit dem Befehl variable=xlsread('dateinme.xls'). Probieren Sie das mit der Datei [entfernungen.xls] aus.  Der Befehl xlswrite('dateiname',variable) soll eine Datei im xls-Format speichern (funktioniert aber auf meinem Apple nicht), probieren Sie ihn auf den Windows-Rechnern aus, indem Sie ein grosse Matrix erzeugen, abspeichern und in Excel oeffnen. Man kann auch mit copy-paste direkt zwischen dem Array Editor in Matlab und Excel hin und her kopieren, allerdings muss man in Excel zunaechst den Bereich markieren, in den eine Matrix kopiert werden soll. Probieren Sie auch das aus.     

* T5_C8) Matlab kann im Prinzip sehr viele Formate importieren - dies per Hand zu tun ist aber oft anstrengend. Deshalb gibt es den "Matlab import wizard", um dabei zu helfen. Schauen Sie bei Interesse in der Hilfe nach, wie man ihn verwendet. Fuer eine Auflistung verschiedener Importfunktionen fuer verschiedene Fileformate (inklusive Sound und Filmen) suchen Sie bitte in der Hilfe nach dem Schlagwort "File Formats".

D) Hausaufgabe

T5_H1) Eine kleine Uebung zum Umgang mit Matrizen und Graphik: Laden Sie sich die Matrix  picturematrix.mat herunter.

  • Stellen Sie die Matrix mit imagesc graphisch dar.
  • Kopieren Sie nur den Teil, der das Haus enthaelt, in eine neue Matrix und stellen Sie es in einem neuen Graphikfenster dar.
  • Erzeugen Sie eine dritte Matrix, die nur einen der Sterne enthaelt und stellen Sie auch diese in einem neuen Fenster graphisch dar. 
  • *) Warum aendert der Stern seine Farbe? Wie koennte man das verhindern?

*T5_H2) Ueben Sie das Suchen in Daten, indem Sie die Musterloesung wunschkatze_jutta.m (oder Ihre eigene Loesung) fuer das Wunschkatzen-Programm von Tag 3 (T3_H5) so erweitern, dass es die Daten (Geschlecht, Alter, Farben) saemtlicher gefundener Wunschkatzen ausgibt. Sortieren Sie diese Angaben nach dem Alter.

*T5_H3) Benutzen Sie die Musterloesung vogeltabelle_insa.m (oder Ihre eigene Loesung) zur Aufgabe T4_H7, um sich eine Matrix gefangener Voegel zu erstellen. Sortieren Sie diese so, dass, zuerst die Amseln, dann die Rotkehlchen und zuletzt die Meisen in der Matrix stehen, wobei innerhalb dieser Gruppen jeweils zuerst die Maennchen und dann die Weibchen aufgelistet werden. Die Tiere einer Art und eines Geschlechts sollen jeweils nach dem Gewicht sortiert sein.

*T5_H4) Fuer Graphik-Freunde: Stellen Sie die Kuchengraphiken aus T5_B3 in den zu den Parteien passenden Farben dar. (Dazu werden Sie in die Hilfe sehen muessen...)

Zum 6. Kurstag



Webmastopueer: Jurbltta xrKretzberg (jutta.z1by9kreudkxtzberg@s2vguol.de2vx+l) (Stand: 07.11.2019)