Matlab SS07 - Tag9
Datenstrukturen
A) Datenstrukturen
Wenn man komplizierte Datenmengen verwalten moechte, stoesst man bei der Verwendung von Variablen der bisher im Kurs eingefuehrten Typen schnell auf das Problem, dass die Lage unuebersichtlich wird. Gerade wenn man Variablen verschiedener Typen aufeinander beziehen muss (z.B. Namen von Versuchstieren mit ihrem Gewicht, ihrem Geschlecht, einer Information, ob sie schonmal Junge bekommen haben, der verwendeten Versuchsbedingung und dem dabei erzielten Ergebnis), muss man sehr sorgfaeltig arbeiten, damit auch alle Vektoren gleich lang bleiben etc. Wenn man ausserdem alle diese Informationen in mehreren Funktionen braucht, muss man jeweils alle Variablen uebergeben und darf dabei nicht die Reihenfolge verwechseln.
Um solche Aufgaben zu loesen, gibt es deshalb einen praktischeren Weg: die Datenstruktur. In einer Struktur kann man mehrere zusammengehoerige Variablen in einer einzigen zusammenfassen, auch wenn sie verschiedene Typen besitzen. Die Variablen innerhalb der Struktur werden auch als "Felder" bezeichnet. Die Struktur kann man dann bequem zwischen Funktionen uebergeben und dort die jeweils relevanten Felder benutzen und evtl veraendern. Eine Struktur erhaelt man durch die Angabe ihrer Felder mit der Syntax
strukturname.feldname=Belegung
Ein Beispiel: Man kann sich eine Struktur vorstellen wie einen Rucksack: statt alle Buecher, Stifte, Taschentuecher, Geldboerse, USB-Stick etc. einzeln in die Uni zu tragen und staendig drauf aufzupassen, ob man noch alles bei sich hat, stopft man alles in den Rucksack und nimmt ihn mit. Wenn man dann im Matlabkurs sitzt, benutzt man aus dem Rucksack den USB-Stick, Stifte und Papier; waehrend man in der Mensa eher den Geldbeutel braucht.
Wie koennte diese Struktur aussehen?
T9A1) Beim Beispiel der Katzen im Tierheim haben wir gesehen, dass es noetig sein kann, verschiedene Arten von Daten so bereitzuhalten, dass man sie aufeinander beziehen kann. Wir haben dort mehrere Vektoren bzw Matrizen benutzt. Diese Vorgehensweise funktioniert, ist aber nicht ungefaehrlich: Laden Sie die Daten ueber die Katzen noch einmal ein: [katzen.mat]
Sortieren Sie die Katzen nach ihrem Alter. Was ist dann ausserdem noetig, damit Sie die anderen Daten ueber die Katzen noch abfragen koennen?
T9A2) Um alle Daten beieinander zu halten, fuehrt man in Matlab eine Struktur ein. Eine Struktur besteht aus mehreren Feldern, die verschiedene Datentypen besitzen koennen. Beispielsweise koennte man fuer die Verwaltung einer Maeusezucht folgende Struktur benutzen. Die erste Maus erzeugt man mit:
maus.ohrmarke='M7777';
maus.kaefig=5;
maus.weiblich=true;
maus.wurfgroessen=[5 8 7];
Lassen Sie sich ausgeben, was gespeichert ist unter maus, maus.kaefig und maus.wurfgroessen(2);
Um eine weitere Maus hinzuzufuegen, muss man dieser einen Index mitgeben:
maus(2).ohrmarke='M7735';
maus(2).kaefig=9;
maus(2).weiblich=true;
maus(2).wurfgroessen=[13 4 10 9];
Denken Sie sich ein paar weitere Maeuse aus und lassen Sie sich ausgeben:
maus
Die Kaefignummern der Maeuse 1 bis 4
Die Groesse des jeweils ersten Wurfs der ersten 3 weiblichen Maeuse.
Irgendwann segnen Maeuse das Zeitliche. Schreiben Sie eine Funktion, die bei Angabe der Ohrmarke den richtigen Eintrag in der Struktur maus loescht.
*T9A3) Denken Sie sich eine Struktur fuer die Katzendaten aus, und setzen Sie die Vektoren in die Struktur um (natuerlich nicht durch Eintippen aller Daten!).
T9A4) Nah verwandt mit Strukturen sind die sogenannten cell arrays. Mit diesen kann man Listen von Variabelen verschiedener Typen verwalten. Wir wollen nur in einem Spezialfall behandeln: Die Schluesselbegriffe varargin und varargout ermoeglichen es einer Funktion eine variable Anzahl von Eingabe- oder Ausgabeargumente zu haben. Man benutzt sie z.B. folgendermassen:
function [varargout]=testvar(varargin)
%Schleife ueber alle Eingabeargumente
for i=1:length(varargin)
%die Eingabeargumente werden in einen Vektor geschrieben :
x(i)=varargin{i};
end
%Schleife ueber die Ausgabeargumente, nargout ist deren Anzahl, diese %Variable wird automatisch von varargout gesetzt:
for i=1:nargout
varargout{i}=2*x(i);
end
Benutzen Sie diese Funktion mit [a b c]=testvar(1, 2, 3,4). Probieren Sie auch andere Kombinationen aus Ein- und Ausgabeargumenten aus.
Dieses Beispiel ist eigentlich ein recht schlechtes, da es ausschliesslich fuer Variablen vom Typ double funktioniert. Erweitern Sie es so, dass alle Variablen aller anderer Datentypenunveraendert wieder ausgegeben werden.
B) Anwendungsbeispiel: Stimulation in einem psychophysikalischen Experiment
Am Schluss des Kurses sollen verschiedene Aspekte des Gelernten in einer Aufgabe zusammengefasst werden, der Stimulation eines psychophysikalischen Experiments.
T9B1) Ein Beispiel fuer eine visuelle Stimulation in einem einfachen psychophysikalischen Experiment ist in der demo [zufallsquadrate.m] gezeigt.
Schauen Sie sich dieses Programm an und probieren Sie es aus. Fuehren Sie schrittweise folgende Aenderungen an dem Programm durch:
a) Bestimmen Sie bei jedem "Sprung" eine zufaellige Farbe, die dem neuen Quadrat zugewiesen wird.
b) Lassen Sie die Dauer der Pause als weiteres Argument durch den Benutzer angeben.
c) Nehmen Sie die Benutzerangabe der Pause als Maximalwert und bestimmen Sie jede individuelle Pause zufaellig zwischen 0s und diesem Maximalwert.
d) Machen Sie die Benutzereingabe der Pause optional. Wenn der Benutzer einen Pausenwert eingibt, wird dieser benutzt, sonst wird 2sec als defaultwert verwendet.
e) Aendern Sie die Wahrscheinlichkeit der Position von einer Gleichverteilung zu einer Normalverteilung rund um die Mitte der Abbildung.
T9B2) Haeufig moechte man die genauen Parameter wissen, die bei einer Stimulation benutzt wurden, entweder um einen Versuch zu reproduzieren, oder um ihn exakt auswerten zu koennen. Dies ist insbesondere fuer zufaellige Reizungen sehr wichtig.
Eine gute Moeglichkeit, die verschiedenen Parameter uebersichtlich zu speichern, ist die Einfuehrung einer Struktur, die alle wichtigen Angaben enthaelt. Waehrend das Programm laeuft, wird diese Struktur gefuellt und im Anschluss an den Programmablauf abgespeichert. Eine entsprechende Version der zufallsquadrate Stimulation finden Sie in [zufallsquadrate_speicher.m]. Eingeladen und reproduziert werden diese Daten mit [zufallsquadrate_laden.m]. Schauen Sie sich beide Programme an und versuchen Sie nachzuvollziehen, wie mit der Struktur umgegangen wird.
a) Im Moment werden die Parameter immer unter dem Namen 'zufquadparameter.mat' abgespeichert, so dass diese Datei bei mehrfachem Aufrufen ueberschrieben wird.
Aendern Sie die Funktion zufallsquadrate_speicher so, dass der Benutzer als Argument einen Dateinamen seiner Wahl angeben kann.
b) Erweitern Sie die Funktion so, dass der Benutzer einen Dateinamen angeben kann (der dann auch zum Speichern verwendet wird) oder nicht.
Wenn kein Dateiname angegeben wird, speichert die Funktion die Parameter in die Datei 'standard.mat'
c) Weisen Sie wie in der letzten Aufgabe dem Quadrat jeweils eine zufaellige Farbe zu, die ebenfalls jeweils mit abgespeichert wird.
d) Erweitern Sie Ihre Funktion um ein zusaetzliches Argument, mit dem man waehlen kann, ob man zufaellige Farben haben moechte, oder ausschliesslich rote, blaue und gruene Quadrate. Wenn diese zweite Option gewaehlt wird, sorgen Sie dafuer, dass diese drei Farben in zufaelliger Reihenfolge auftreten, aber jede der Farben gleich oft gezeigt wird (bzw eine Farbe einmal haeufiger oder seltener auftritt, wenn die Anzahl der Wiederholungen nicht durch 3 teilbar ist.)