Navigation

A) Speichern und Laden von Daten:

Im Normalfall bedient man Matlab nicht durch eintippen aller Daten, die man verarbeiten moechte, sondern benutzt Dateien, aus denen Daten eingelesen und in die Daten abgespeichert werden. Beim Abspeichern einer Datei mit dem Befehl save Dateiname legt Matlab standardmaessig seinen Workspace (also alle aktuellen Variablen) auf dem Datentraeger ab. Die dabei automatisch erzeugte Endung des Dateinamens ist .mat . Wenn man nur einen Teil der aktuellen Variablen abspeichern moechte, muss man dies gezielt mit angeben (s. T2_A4).

Beim Einlesen einer .mat Datei mit dem Befehl load Dateiname (es ist egal, ob man nur Dateiname oder Dateiname.mat angibt) erzeugt Matlab die darin abgespeicherten Variablen in seinem Workspace. Achtung: Die eingelesenen Variablen haben die gleichen Namen, die sie vor dem Abspeichern hatten (und nicht etwa den Dateinamen). Wenn Variablen des gleichen Namens im Workspace vorhanden sind, werden diese ueberschrieben!

Achtung: Matlab benutzt zum Speichern und Laden jeweils das aktuelle Verzeichnis, das oben in der Leiste Current Directory angegeben wird.  Das Verzeichnis kann man wechseln, indem man sich im Current Directory Fenster durch Klicken an die richtige Stelle im Verzeichnisbaum bewegt. Eine haeufig schnellere Moeglichkeit ist es, den Pfad ueber die Commandozeile anzugeben. Der Befehl fuer einen Wechsel des Verzeichnisses lautet cd. Z.B. bedeutet cd Tag1 "wechsele in den Unterordner Tag1". Um ein Verzeichnis nach oben zu wechseln, benutzt man die Bezeichnung .. so kann man mit dem Befehl cd ../Tag2 z.B. von einem Unterordner Tag1 direkt in einen anderen Unterordner Tag2 wechseln. Die direkte Angabe des Verzeichnisses ist insbesondere dann praktisch, wenn man eine Datei in einem anderen als dem gerade aktuellen laden oder speichern moechte. Z.B. bedeutet save Tag1/testdatei dass der aktuelle Workspace im Unterverzeichnis Tag1 unter dem Namen testdatei.mat abgespeichert wird.

Es koennen auch Dateien eingelesen werden, die nicht von Matlab erzeugt wurden (z.B. Text-, Bild-, Excell-Dateien etc). Dafuer werden haeufig spezielle Befehle benoetigt. Matlab kann auch Dateien anderer Datentypen schreiben.

T2_A1) Bevor Sie anfangen, Dateien abzuspeicher, definieren Sie sich einen Ort, wo Sie im weiteren alle Dateien des Kurses hinsortieren. Erzeugen Sie sich zunaechst in Ihrem "Eigene Dateien" Verzeichnis einen neuen Ordner "matlabkurs" (oder welcher Name Ihnen gefaellt). Wechseln Sie in Matlab in dieses Verzeichnis, indem Sie auf das icon neben der Anzeige "Current Directory" klicken.
Achten Sie in Zukunft jedesmal wenn Sie Matlab neu starten darauf, dass Sie sich im richtigen Verzeichnis befinden.

T2_A2) Erzeugen Sie eine Matrix A=[1 2 3; 4 5 6]. Speichern Sie diese mit save MatrixA ab. Schauen Sie im Fenster "Current Directory" nach, ob dort die neue Datei auftaucht. Um sich zu ueberzeugen, dass die Matrix wirklich gespeichert ist, loeschen Sie sie aus dem Workspace mit clear A. Laden Sie die Matrix wieder ein mit load MatrixA. Ueberpruefen Sie, dass die Matrix wieder im Workspace vorhanden ist.

T2_A3) Definieren Sie sich zusaetzlich eine Matrix B=[0 0 1; 1 0 0] und berechnen Sie C=A+B und D=A.*B. Speichern sie den gesamten Workspace mit save AufgabeT2_A3. Loeschen Sie alle Variabele mit clear all aus dem Workspace. Laden Sie AufgabeT2_A3 wieder ein und ueberpruefen Sie, dass alle Variablen wieder da sind.

T2_A4) Haeufig will man nicht alle Variablen speichern, die gerade zufaellig im Workspace sind, sondern nur eine Auswahl. Probieren Sie folgende Abfolge aus: save MatrixCD C D, clear all, load MatrixCD. Was ist jetzt im Workspace vorhanden? Und was, wenn Sie nocheinmal load MatrixA dazutippen?

T2_A5) Statt load FILENAME einzutippen, kann man sich auch im Fenster links das Current Directory  anzeigen lassen und die gewuenschte Datei per Doppelklick auswaehlen. Probieren Sie das mit  AufgabeT1_A3.mat aus.

T2_ A6) Achtung! Bei Einladen von Variablen werden die Werte von Variablen gleichen Namens ueberschrieben. Definieren Sie sich ausgehend vom aktuellen Workspace eine neue Variable A=1 und laden Sie dann MatrixA.mat ein. Was passiert jeweils im Workspace?

T2_ A7) Kopieren Sie sich folgende Datei in Ihr Verzeichnis und laden Sie in Matlab ein: grosse_Matrix.mat (bzw falls Sie Matlab 6 verwenden: grosse_Matrix_v6.mat). Wie viele Zeilen und Spalten hat diese Matrix? Schauen Sie sich die Matrix mit dem Array Editor an. Greifen Sie die 4. Spalte und die 10. Zeile jeweils als Vektor heraus.

T2_A8) Sehen Sie sich MatrixA.mat in einem beliebigen Texteditor an. Was sehen Sie? Falls Sie Werte aus Matlab abspeichern und mit einem anderen Programm weiterverwenden wollen, speichern Sie das file besser mit der Option "-ascii" ab. Z.B.: clear, E=[89 76 0.1 9.7], save -ascii MatrixE.txt. Sehen Sie sich das Resultat im Texteditor und in Matlab an. Probieren Sie aus, was passiert, wenn man mehrere Variable in ein Textfile schreibt.

T2_A9) Erzeugen Sie sich in ihrem persoenlichen Matlab-Verzeichnis ein Unterverzeichnis. Probieren Sie zwei Wege aus, eine Datei in dieses Unterverzeichnis zu schreiben: zunaechst wechseln Sie in das Verzeichnis und speichern dort ab. Dann wechseln Sie wieder in das urspruengliche Verzeichnis eine Ebene hoeher und speichern mit save unterordner/dateiname2 (benutzen Sie dabei einen anderen Dateinamen als beim ersten Speichern, sonst wird die Datei ueberschrieben). Versuchen Sie beide Files sowohl vom Hauptverzeichnis als auch vom Unterverzeichnis aus einzuladen.

* T2_A10)  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 z.B. grosse_Matrix 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.   

* T2_A11) Speziell fuer Nutzerinnen und Nutzer von Matlabversion 6 oder weniger: Matlab hat die Art seiner Abspeicherung von Version 6 nach 7 geaendert. Wenn Sie immer mit Version 7 (oder spaeter hoeher) oder immer mit Version 6 (oder niedriger) arbeiten, koennen sie die ganz normalen save und load Befehle benutzen. Wenn Sie aber zwischen den Versionen wechseln, muessen Sie beim Abspeichern unter Matlab 7 folgende Spezielversion von save verwenden:
save('Dateiname','-v6') bzw save('Dateiname','var1','var2','-v6')
Dann koennen Matlab 6 und Matlab 7 die Files einlesen. Von Matlab 6 geschriebene Files koennen von Matlab 7 ohne Probleme gelesen werden.

B) Matlabskripte:

Fuer aufwaendige Berechnungen waere es viel zu viel Arbeit, jedesmal alle Arbeitsschritte einzeln in das Command Window zu tippen. Dafuer gibt es die Moeglichkeit, Skripte zu schreiben - Abfolgen von Befehlen, die in immer gleicher Weise ausgefuehrt werden. Bei einem Skript handelt es sich um die implementierte Version eines Algorithmus. Wenn man das Skript unter einem bestimmten Dateinamen mit der Endung .m abgespeichert hat (der Matlab-Editor ergaenzt diese Endung automatisch), hat man damit einen neuen Matlab-Befehl erzeugt. Ruft man diesen Befehl auf, indem man ihn in das Command Window eintippt, werden nacheinander alle Zeilen der Datei abgearbeitet. Erst wenn die gesammte Abarbeitung erfolgt ist, kann der naechste Befehl in das Command Window eingegeben werden. Natuerlich kann der neue Befehl auch innerhalb eines anderen Skripts (oder einer Funktion) verwendet werden. Tatsaechlich sind sich gegenseitig aufrufende Programmteile sogar eine ausgesprochen uebliche und nuetzliche Art, ein grosses Programm zu strukturieren. 

Falls Sie das noch nicht getan haben, ist jetzt der richtige Zeitpunkt sich die Texte Wichtige Konzepte in Matlab und Wichtige Schritte beim Programmieren anzusehen, deren Inhalt hier nicht noch einmal wiederholt werden soll.

Damit Sie selber und auch andere Leute Ihre geschriebenen Matlabprograbprogramme auch nach einiger Zeit noch nachvollziehen koennen, sollte Sie sich als "guten Stil" angewoehnen:
- der Datei einen aussagekraeftigen Namen zu geben
- aussagekraeftige Variablennamen zu verwenden
- grosszuegig zu kommentieren (am besten jede Zeile, die nicht total offensichtlich ist)
- das Programm mit einem Hilfetext zu versehen.

Der Matlab-Editor ist mehr als ein Fenster zum Eintippen und Speichern von Befehlen. Er beinhaltet eine Reihe von Werkzeugen, die einem das Programmieren und insbesondere das Finden von Fehlern in Programmen ("Debugging") erleichtern.

T2_B1)  Oeffnen Sie den Matlab-Editor, indem Sie auf das Symbol fuer ein neues Dokument klicken. Und tippen Sie dort ein:

clear all
A1=ones(2,5);
A2=2*ones(2,5);
Asum=A1+A2;

Speichern Sie dieses Skript als "skriptchen.m" ab (unter File->save as). Achten Sie darauf, dass sie im richtigen Verzeichnis sind. Rufen Sie im Command Window Ihr erstes Programm auf, indem Sie "skriptchen" eintippen. Was passiert im Workspace?
Loeschen Sie jetzt in jeder Zeile Ihres Skripts das Semikolon, speichern sie es ab und lassen es nochmal laufen. Was ist der Unterschied?

T2_B2) Bei unserem Skript geht alles sehr schnell. Ergaenzen Sie nach jeder Zeile des Skripts die Zeile "pause" - diese haelt das Skript bei der Ausfuehrung jeweils solange an, bis sie eine beliebige Taste druecken. Beobachten Sie Schritt fuer Schritt, was im Workspace passiert.

T2_B3)  Statt jeweils "pause" einzutippen, kann man auch den Matlab-Editor fuer sich arbeiten lassen. Probieren Sie seine Moeglichkeiten aus:
- Wenn man auf das Symbol mit dem Pfeil nach unten klickt, laeuft das Skript los.
- Wenn nicht das ganze Programm durchlaufen soll, sondern man den Zustand des Workspace zwischendurch untersuchen will, kann man dafuer sogenannte "breakpoints" setzen, bei denen der Programmablauf unterbrochen wird. Das geht, indem man vor der Zeile, deren Effekt man sehen will, auf den kleinen Strich klickt. Dieser wird dann zum roten Punkt. Durch nochmaliges Klicken verschwindet er wieder.
- Probieren Sie aus, was passiert, wenn Sie einen Breakpoint setzen und das Skript laufen lassen. Testen Sie, was Sie waehrend dieser Unterbrechung im Matlab Command Window tun koennen und was nicht. Was passiert, wenn man in diesem Zustand auf die verschiedenen Pfeilsymbole oben im Editor klickt? Wie kommt man insbesondere wieder aus dem Debugging-Modus heraus?

T2_B3) Schreiben Sie ein Skript "spaghettiskript" zur Loesung der folgenden Aufgabe:

Gesucht ist die Gesamtlaenge der Spaghetti auf Ihrem Mensateller, wenn diese in Laengsrichtung geradegezogen aneinandergereiht werden.
Sie wissen, dass die Spaghetti (ohne Sosse) 250g schwer sind, in gekochtem Zustand einen Durchmesser von 2mm und ein spezifisches Gewicht von 1.05g/cm^3 haben.
(Falls es Ihnen zu bloed ist, sich mit Spaghetti zu beschaeftigen, stellen Sie sich vor, es handele sich um die Gesamtlaenge der DNA in einem Zellkern, diese kann man im Prinzip entsprechend berechnen.) 

Ueberlegen Sie sich den Rechenweg.
Setzen Sie diesen schrittweise in Zeilen Ihres Skripts um, verwenden Sie dabei aussagekraeftige Variablennamen und achten Sie darauf, dass die Einheiten passen!
Testen Sie Ihr Skript, indem Sie es laufen lassen.
Falls das Skript nicht das erwartete Ergebnis liefert, koennen Sie die Debugging-Funktionen des Editors verwenden, um den Fehler zu finden.

T2_ B4) Es ist sehr wichtig, beim Programmieren Kommentare in das Programm zu schreiben, damit man auch nach ein paar Jahren noch weiss, was man sich dabei gedacht hat. Ergaenzen Sie hinter jeder Programmzeile abgetrennt durch "%" als Kommentar, was gerade passiert, z.B.

clear all  % alle Variablen aus dem Workspace loeschen

T2_B5) Ausser der Kommentare zu den einzelnen Zeilen sollte jedes Programm einen Kommentar-Kopf haben. Schreiben Sie einen Hilfetext fuer spaghettiskript.m, indem Sie eine erste Zeile (mit % beginnend) ergaenzen, die den Namen des Skripts  nennt und seinen Inhalt erlaeutert, z.B.

% skriptchen.m ist ein Beispielskript, in dem zwei festgelegte Matrizen addiert werden.

T2_B6) Diese erste Zeile (bzw alle ersten Zeilen, die mit % beginnen) dienen als Hilfetext zum jeweiligen Skript: Tippen Sie in das Command Window "help spaghettiskript".

T2_B7) Ein Skript greift direkt auf die Variablen im Workspace zu und kann diese veraendern. Probieren sie das aus, indem sie zunaechst mit "clear all" alle Variablen loeschen und dann einem Variablennamen, den Sie in Ihrem Skript verwenden, um Command Window die Matrix [1 1; 2 2] zuweisen. Lassen Sie dann das Spaghettiskript laufen. Was passiert im Workspace?

C) Funktionen

 Manchmal moechte man nicht, dass ein Skript die Variablen des Workspace veraendert, weil man diese weiterverwenden moechte. Dann nutzt man statt dessen eine Funktion. Ein Skript fuehrt ein Eigenleben vom Workspace: die im Workspace enthaltenen Variablen sind nicht automatisch innerhalb der Funktion bekannt und die innerhalb der Funktion verwendten Variablen sind nach Abarbeiten der Funktion nicht automatisch im Workspace enthalten. Fuer die Kommunikation zwischen Workspace und Funktion dienen Argumente: Eingabeargumente uebergeben Variablen aus dem Workspace an die Funktion, so dass sie dort verwendet werden koennen. Ausgabeargumente uebermitteln Ergebnisse der Funktion an den Workspace.

Um eine Funktion zu erzeugen, muss in der ersten Zeile der Datei ("Kopf") das Schluesselwort function stehen. Die Syntax fuer die Erzeugung einer Funktion ist die gleiche wie fuer den Aufruf einer Funktion, bis auf dieses Schluesselwort:

Erzeugung: function [Ausgabe1,Ausgabe2] = Funktionsname (Eingabe1, Eingabe2)

Aufruf: [Ausgabe1,Ausgabe2] = Funktionsname (Eingabe1, Eingabe2)

Guter Stil:
- Verwenden Sie immer den gleichen Namen fuer die Datei, den sie auch im Kopf der Funktion verwenden.
- Fangen Sie "unsinnige" Eingabeparameter durch Abfragen ab. (Wie das geht, besprechen wir morgen. )
- Ueberlegen Sie sich bevor Sie ein Programm schreiben, ob eine Funktion oder ein Skript die bessere Wahl ist und ob Sie bestimmte Teile des Programms in eine Unterfunktion oder ein Unterskript auslagern wollen.

T2_C1) Kopieren Sie den Inhalt von spaghettiskript.m mit dem Editor in eine neue Datei und ergaenzen Sie "function spaghettifunktion" als erste Zeile, noch vor dem Hilfetext. Speichern Sie die Datei als spaghettifunktion.m ab (praktischerweise wird der Matlab-Editor Ihnen das sowieso als Standardoption anbieten).
Lassen sie "spaghettifunktion" laufen. Was passiert?
Loeschen Sie alle Variablen des Workspace und lassen die Funktion wieder laufen. Was passiert?
Definieren Sie wie in A7) eine Ihrer Variable als [1 1; 2 2] und lassen "spaghettifunktion" laufen. Was passiert? Welchen Wert hat die Variable jetzt?
(Achtung: Wir werden die Funktion jetzt schrittweise veraendern. Falls Sie alle Versionen aufheben wollen, muessen Sie jeweils einen neuen Funktionsnamen zum Speichern und Aufrufen verwenden, z.B. spaghettiskriptB1. Denken Sie dran, bei diesem und den naechsten Schritten jeweils den Hilfetext zu aktualisieren!)  

T2_C2) Haeufig moechte man, dass eine Funktion ein Ergebnis liefert, das man auch weiter verwenden kann. Dies wird durch ein Ausgabeargument erreicht. Ergaenzen Sie dazu in der ersten Zeile: "function laenge=spaghettifunktion"
Loeschen Sie alle Variablen des Workspace und rufen Sie "spaghettifunktion" auf. Was passiert?
Vielleicht moechten Sie das Ergebnis Ihrer Funktion weiterverwenden. Weisen Sie dazu seinen Ausgabewert einer neuen Variablen zu, indem Sie z.B. "spaghettilaenge=spaghettifunktion" aufrufen.

T2_C3) Bekanntlich schwankt die Spaghetti-Menge auf Mensatellern erheblich, je nach Persoenlichkeit und Laune des Mensapersonals. Wir tragen dem Rechnung, indem wir die  Funktionalitaet unserer Funktion aendern und die erste Zeile um ein Eingabeargument ergaenzen:
"function laenge=spaghettifunktion(gewicht)"
und die Variable "gewicht" fuer Ihre Berechnung benutzen. (Wahlweise koennen Sie auch gerne, wenn Sie in Ihrer Funktion bereits eine andere Bezeichnung fuer das Gewicht gewaehlt haben, diesen Variablennamen in die Klammer der ersten Zeile schreiben.)
Rufen sie zum Test die Funktion auf mit "laenge=spaghettifunktion(250)". Entspricht das Ergebnis Ihrer Erwartung? Berechnen Sie die Laengen fuer ein paar andere Gewichte.
Was passiert, wenn man Funktioenchen jetzt ohne Ein- oder ohne Ausgabeargument aufruft?
Versuchen Sie Ihre Spaghettifunktion auszutricksen, indem Sie ihr "unpassende" Eingabewerte geben, z.B. eine Matrix. Was funktioniert? Wann gibt es Fehlermeldungen?

T2_C4) Zu unserem Leidwesen schwankt nicht nur die Menge der Spaghetti auf dem Teller, sondern auch ihre Konsistenz. Wenn sie mal wieder voellig verkocht sind, haben sie ein spezifisches Gewicht, das nicht wesentlich von Wasser abweicht, also z.B. bei 1.01g/cm^3 liegt.
Um das einzubeziehen, brauchen wir mehrere Eingabeargumente. Ergaenzen Sie das spezifische Gewicht als weiteres Eingabeargument und benutzen es in der Berechung. Die Liste der Eingabeargumente steht (sowohl im Programmtext als auch beim Aufruf) durch Kommata getrennt in der Klammer hinter dem Funktionsnamen.
Testen Sie Ihre neue Funktion.

T2_C5) Um die Variabilitaet der Spaghettiqualitaet zu demonstrieren, setzen Sie sich in den Kopf, eine Spaghettischlange von der Mensa Wechloy bis zur Hauptmensa (1.3km) zu legen.  Ergaenzen Sie deshalb als weiteres Ausgabeargument die Anzahl der Spaghettiportionen, die sie fuer diese Strecke brauche. Die Ausgabeargumente stehen in eckigen Klammern vor dem Gleichheitszeichen und dem Funktionsnamen.
Testen Sie Ihre neue Funktion.
*) Da man in der Mensa keine Bruchteile von Spaghettiportionen kaufen kann, runden Sie bitte die Angabe der Portionen auf die naechstgroessere ganze Zahl. Schauen Sie dazu in der Hilfe nach, welche Funktion Sie verwenden koennen.

T2_C6) Probieren Sie aus, wie sich der Debugging-Modus des Editors verhaelt, wenn man ihn auf eine Funktion anwendet. Welche Unterschiede gibt es zur Benutzung bei einem Skript? 

D) Hausaufgaben

* T2_D1) Sie kennen bereits den Operator ^, mit dem man "x hoch n" berechnet. Schreiben Sie eine Funktion xhochntel die als Eingabeparameter einen Vektor x und einen Vektor n bekommt und als Ausgabe einen Vektor mit den elementeweise berechneten Kehrwerten von "x hoch n" zurueckliefert. 

* T2_D2) Sie haben gestern auch schon einige Funktionen kennengelernt, z.B. sin, rem und size. Wieviele Ein- und Ausgabeargumente haben diese Funktionen jeweils? Schauen Sie in der Hilfe nach.

T2_D3) Schreiben Sie eine Funktion, die aus einer beliebigen Matrix die vier "Ecken" (oben links, oben rechts, unten links, unten rechts) als Vektor zurueckgibt. 

* T2_D4) Schreiben Sie eine Funktion, die die Elemente auf der Diagonalen einer quadratischen Matrix als Vektor zurueckgibt.

T2_D5) Laden Sie sich folgende Funktion herunter, speichern sie in Ihrem Verzeichnis ab und schauen Sie mit dem Matlab-Editor an: kompliziert.m
Wieviele Ein- und Ausgabeargumente hat diese Funktion?
Versuchen Sie im Editor die Abfolge der Programmschritte nachzuvollziehen, was tut die Funktion? Testen Sie Ihre Hypothese durch geeignete Eingabeparameter. Wenn Sie die Semikolon loeschen, koennen Sie die einzelnen Schritte im Command Window verfolgen. Alternativ verwenden Sie die Debugging-Funktion des Editors.
*) Was passiert, wenn man die Funktion nicht wie im Hilfetext angegeben mit zwei gleich grossen Matrizen aufgerufen wird? Warum?

T2_D6) Die Werte eines Vektor v lassen sich mit plot(v) grafisch darstellen. Schreiben Sie eine Funktion, die eine Matrix und einen skalaren Wert n als Eingabe bekommt und die n-te Zeile dieser Matrix grafisch darstellt. Testen Sie die Funktion mit einigen verschieden grossen Matrizen (am besten auch mit sehr grossen).
[Eine grosse Beispielmatrix: ueberraschung.mat]
[bzw. fuer Matlab 6: ueberraschung_v6.mat ]
Was steckt in der Ueberraschungsmatrix? 

T2_D7) Wie bereits erwaehnt, koennen Funktionen auch andere Funktionen aufrufen. Schreiben Sie eine Funktion, die die erste, die mittlere und die letzte Spalte einer Matrix jeweils in einem neuen Graphikfenster darstellt, und dazu die Funktion aus T2_D6 benutzt. Ein neues Graphikfenster oeffnet man mit dem Befehl figure 

Zum 3. Kurstag

Webmapasibqjcteiflar: Juttasp Krehoa9ntzbaver+jffg0wk (jutta.ktk1ypretzberg@ufgwool.xqyde) (Stand: 07.11.2019)