Anwendungssoftware III (MATLAB) VI Eingaben und Ausgaben in MATLAB Michael Liedlgruber Fachbereich Computerwissenschaften Universität Salzburg Sommersemester 2014 M. Liedlgruber Anwendungssoftware III (MATLAB) SS 2014 1 / 32
Eingaben im Eingaben im Command Window Ausgaben im Command Window Um eine interaktive Eingabe des Benutzers in einem Skript zu erlauben, bietet MATLAB die Funktioninput. Die Funktion wird folgendermaßen aufgerufen: value = input( Eingabeprompt ); Standardmäßig erwartetinput die Eingabe eines gültigen MATLAB-Ausdrucks. Das Ergebnis dieses Ausdrucks wird dann der Variable value zugewiesen wird. Es ist also möglich, folgende Eingaben zu tätigen: einfache Werte Vektoren und Matrizen Funktionsaufrufe Um dem Benutzer die Eingabe einer Zeichenkette (String) zu ermöglichen, muss als zweiter Parameter s angegeben werden: value = input( Eingabeprompt, s ); M. Liedlgruber Anwendungssoftware III (MATLAB) SS 2014 2 / 32
Eingaben im Eingaben im Command Window Ausgaben im Command Window Ein Beispiel zu Input >> t = input( Titel:, s ); a = input( Amplitude: ); x = input( x-werte: ); y = a * input( f(x): ); plot(y); title(t); Titel: Sinus-Plot % Eingabe des Titels <ENTER> Amplitude: 10 % Eingabe von 10 <ENTER> x-werte: -pi:0.01:pi % Vektoreingabe <ENTER> f(x): sin(x) % Angabe der Sinusfunktion <ENTER> Das Ergebnis ist der folgende Plot: 10 Sinus-Plot 0-10 0 100 200 300 400 500 600 700 M. Liedlgruber Anwendungssoftware III (MATLAB) SS 2014 3 / 32
Ausgaben im Eingaben im Command Window Ausgaben im Command Window Wir wissen bereits: der Wert einer Variable kann ausgegeben werden, indem man den Namen der Variable im eingibt: >> A = [1 2 3]; >> A A = 1 2 3 Es gibt in MATLAB jedoch noch weitere Möglichkeiten, um Ausgaben zu erreichen. Vor allem, wenn die Ausgabe kompakter oder besser formatiert sein soll, bieten sich folgende Funktionen an: disp erzeugt eine einfache und kompakte Ausgabe. fprintf erzeugt eine Ausgabe, welche aufgrund vieler Formatierungsoptionen genau an individuelle Bedürfnisse angepasst werden kann. M. Liedlgruber Anwendungssoftware III (MATLAB) SS 2014 4 / 32
Ausgaben im Eingaben im Command Window Ausgaben im Command Window Dasdisp-Kommando Um einfache Strings auszugeben, übergibt mandisp den gewünschten String: >> disp( Dies ist ein Test-String ); Dies ist ein Test-String Der Wert von Variablen wird ausgegeben, indem man die entsprechende Variable als Parameter verwendet: >> x = 1:5; >> x % normale Ausgabe x = % Variablenname wird ausgegeben 1 2 3 4 5 >> disp(x); % kompakte Ausgabe - ohne Variablenname 1 2 3 4 5 >> disp(randn(3, 3)); % Ausgabe bei einer Matrix -1.0265-0.2318-1.9804-0.8697-0.7515-1.2938 0.8542-1.0367 0.0822 Wir sehen:disp erzeugt eine kompakte Ausgabe (ohne Variablennamen). M. Liedlgruber Anwendungssoftware III (MATLAB) SS 2014 5 / 32
Ausgaben im Eingaben im Command Window Ausgaben im Command Window Dasfprintf-Kommando Wir haben gesehen, dass die Funktiondisp eine Ausgabe im Command Window erzeugt. Die Funktionfprintf erlaubt im Gegensatz zudisp zusätzlich eine exakte Formatierung der Ausgabe. Generelle Form des Aufrufs vonfprintf: fprintf(formatstring, Variablen,...) Wir sehen Es gibt einen Formatstring. Dieser gibt an wie die Ausgabe der angegebenen Variablen zu erfolgen hat (enthält üblicherweise einen oder mehrere Formatanweisungen). Es werden mehrere Variablen unterstützt. Hinweis: die Funktionsprintf funktioniert ähnlich wiefprintf, gibt jedoch nichts im aus, sondern gibt einen String zurück, welcher die formatierte Ausgabe enthält (siehedoc sprintf). M. Liedlgruber Anwendungssoftware III (MATLAB) SS 2014 6 / 32
Ausgaben im Eingaben im Command Window Ausgaben im Command Window Beispiele für dasfprintf-kommando Ausgabe einer einfachen Meldung ohne Variablen (das Zeichen\n wird dabei verwendet, um nach der Ausgabe in die nächste Zeile zu springen): >> fprintf( Eine Testmeldung\n ); Eine Testmeldung Ausgabe einer Variable mit Text. Das%-Zeichen signalisiert den Beginn einer Formatanweisung: >> fprintf( Wert von pi: %4.2f\n, pi); Wert von pi: 3.14 Die Formatanweisung in diesem Beispiel bedeutet, dass eine Gleitkommazahl (f) mit einer Gesamtbreite von4zeichen und2nachkommastellen ausgegeben werden soll. M. Liedlgruber Anwendungssoftware III (MATLAB) SS 2014 7 / 32
Ausgaben im Eingaben im Command Window Ausgaben im Command Window Wie bereits angedeutet, können mitfprintf auch mehrere Variablen auf einmal ausgegeben werden. Dazu wird für jede Variable eine eigene Formatanweisung benötigt: >> fprintf( Kosinus von %4.2f = %8.4f\n, pi, cos(pi)); Kosinus von 3.14 = -1.0000 Dieses Beispiel gibtπ auf zwei Nachkommastellen (Gesamtbreite 4) aus. Zudem wird der Wertcos(π) = 1 mit einer Gesamtbreite von 8 Zeichen (4 Nachkommastellen) ausgegeben. Zudem können auch Vektoren oder Matrizen ausgegeben werden: >> A = [1 2 3; 4 5 6]; >> fprintf( a = %2.2f b = %2.2f\n, A); a = 1.00 b = 4.00 % Spalte 1 von A a = 2.00 b = 5.00 % Spalte 2 von A a = 3.00 b = 6.00 % Spalte 3 von A Die Möglichkeiten zur Formatierung sind vielfältig. Nähere Details dazu sind in der MATLAB-Hilfe zu finden (doc fprintf). M. Liedlgruber Anwendungssoftware III (MATLAB) SS 2014 8 / 32
Binärdateien Manchmal kann es sinnvoll oder notwendig sein, Daten in einer Datei zu speichern oder Daten aus Dateien zu lesen. Dabei unterscheidet man prinzipiell zwischen folgenden Dateitypen: Binärdateien Um Daten aus Dateien zu lesen oder in Dateien zu schreiben bietet MATLAB unter anderem folgende Funktionen: Funktion Lesen Schreiben Text Binär fscanf fprintf fread fwrite Weitere Funktionen für das findet man in der MATLAB-Hilfe (doc iofun). M. Liedlgruber Anwendungssoftware III (MATLAB) SS 2014 9 / 32
Binärdateien Um mit einer Datei arbeiten zu können, muss diese zuerst geöffnet werden. Dies geschieht mit dem Kommandofopen: file_handle = fopen(dateiname, Öffnungsmodus); Ist beim Öffnen kein Fehler aufgetreten, enthältfile_handle einen Verweis auf die geöffnete Datei, welcher dann für die Lese- und Schreibbefehle benötigt wird (bei einem Fehler enthältfile_handle den Wert -1). Der Öffnungsmodus ist ein String und gibt an wie eine Datei geöffnet werden soll: Öfnungsmodus wt rt wb rb Beschreibung Textdatei zum Schreiben öffnen Textdatei zum Lesen öffnen Binärdatei zum Schreiben öffnen Binärdatei zum Lesen öffnen Es gibt auch noch andere Modi um Dateien zu öffnen. Dazu mehr in der MATLAB-Hilfe (doc fopen). M. Liedlgruber Anwendungssoftware III (MATLAB) SS 2014 10 / 32
Binärdateien Ist die Arbeit an einer Datei abgeschlossen, sollte diese unbedingt korrekt geschlossen werden. Dies geschieht mit Hilfe des Befehlsfclose und dem beifopen zurückgelieferten Verweis auf die offene Datei: fclose(file_handle); M. Liedlgruber Anwendungssoftware III (MATLAB) SS 2014 11 / 32
Arbeiten mit Binärdateien Das Arbeiten mit hat folgende Vorteile: Daten können formatiert gespeichert werden die Dateien können mit jedem Texteditor geöffnet und geändert werden Folgendes Beispiel >> x = 1:10; y = x.^2; >> f = fopen( test.txt, wt ); % Schreibmodus (Text) >> fprintf(f, %2.f %3.f\n, [x; y]); >> fclose(f); erzeugt folgende Textdatei: 1 1 2 4 3 9... 8 64 9 81 10 100 M. Liedlgruber Anwendungssoftware III (MATLAB) SS 2014 12 / 32
Arbeiten mit Binärdateien Um eine Textdatei einzulesen, verwenden wir den Befehlfscanf: >> f = fopen( test.txt, rt ); % Lesemodus (Text) >> A = fscanf(f, %f %f ); % Format einer Zeile in der Datei >> fclose(f); >> x = A(1:2:end) x = 1 2 3 4 5 6 7 8 9 10 >> y = A(2:2:end) y = 1 4 9 16 25 36 49 64 81 100 Hinweis: MATLAB liest die Werte zeilenweise aus der Datei ein und gibt das Ergebnis als einen langen Spaltenvektor zurück. Alternativ kann man die Größe der Daten explizit beifscanf angeben: >> f = fopen( test.txt, rt ); >> A = fscanf(f, %f %f, [2, Inf]); >> fclose(f); [2, Inf] gibt an, dass bis zum Ende der Datei gelesen werden soll (Inf) und die Rückgabematrix 2 Zeilen haben soll (da 2 Spalten in Datei). M. Liedlgruber Anwendungssoftware III (MATLAB) SS 2014 13 / 32
Arbeiten mit Binärdateien Binärdateien Wie bereits erwähnt, kann MATLAB aber auch mit Binärdateien umgehen. Diese haben gegenüber folgende Vorteile: Daten werden platzsparender gespeichert Das Lesen und Schreiben ist effizienter (schneller) Im folgenden Beispiel wird eine binäre Datei erzeugt, welche die ersten 1000 Quadratzahlen beinhaltet: >> f = fopen( test.bin, wb ); % Schreibmodus (Binär) >> x = (1:1000).^2; >> fwrite(f, x, float32 ); >> fclose(f); Hinweis: das letzte Argument beifwrite gibt an, mit welcher Präzision die Daten gespeichert werden sollen (in diesem Fallfloat32, also der Datentyp single). Weitere mögliche Präzisionen sind zum Beispielint8,int16,int32, float64 unddouble (siehedoc fread). M. Liedlgruber Anwendungssoftware III (MATLAB) SS 2014 14 / 32
Arbeiten mit Binärdateien Binärdateien Um binäre Daten aus einer Datei auszulesen, stellt MATLAB den Befehlfread zur Verfügung. Wie in folgendem Beispiel ersichtlich, kann auch beifread eine Präzision angegeben werden: >> f = fopen( test.bin, rb ); >> x = fread(f, float32 ); >> fclose(f); >> length(x) ans = 1000 % wir haben 1000 Zahlen eingelesen Wichtig Wurden Daten mittelsfwrite in eine Datei geschrieben, muss beifread die gleiche Präzision verwendet werden. Ansonsten sind die eingelesenen Daten üblicherweise unbrauchbar. M. Liedlgruber Anwendungssoftware III (MATLAB) SS 2014 15 / 32
Formatierung für einen Import Formatierung Das Importieren von Daten in MATLAB kann eine sehr komplizierte Angelegenheit sein. Dies hängt sehr stark von den zu importierenden Daten ab. Beherzigt man folgende Ratschläge, wird es auf jeden Fall etwas leichter, Daten in MATLAB zu importieren: eine zu importierende Datei sollte nur Zahlen beinhalten (bis auf Spaltenbezeichner in der ersten Zeile). um Daten vor einem Import zu manipulieren, sollte ein anderes Programm (z.b. MS Excel, OpenOffice, LibreOffice) verwendet werden. die Daten sollten nur Werte für eine Variable pro Spalte beinhalten. um Datumswerte zu importieren, sollten diese vor dem Import in ein numerisches Format umgewandelt werden (Vermeidung von Konvertierungproblemen bei Daten). M. Liedlgruber Anwendungssoftware III (MATLAB) SS 2014 16 / 32
importieren Der einfachste Weg, Daten auf robuste Art und Weise in MATLAB zu importieren, ist der Import von. Formatierung Dazu müssen in Excel ein paar Punkte beachtet werden: nur eine Variable pro Spalte Spaltenbeschriftungen verwenden (werden dann als Variablennamen verwendet) nur Zahlen verwenden (speziell bei Datumswerten) Um Datumswerte in Zahlen umzuwandeln geht man in Excel wie folgt vor (in OpenOffice und LibreOffice funktioniert dies ähnlich): 1. Datumswerte auswählen 2. Rechtsklick auf die Auswahl 3. Im Kontextmenü Format wählen 4. Beim Format auf Zahl umstellen M. Liedlgruber Anwendungssoftware III (MATLAB) SS 2014 17 / 32
importieren Formatierung über den Import Wizard importieren Der Import von ist in MATLAB am einfachsten über den Workspace Browser (Button Import Data ) zu bewerkstelligen. Alternativ kann der Import auch über den Current Directory Browser erfolgen: 1. in das Verzeichnis wechseln, welches die Excel-Datei beinhaltet 2. Rechtsklick auf die Excel-Datei 3. im Menü Import Data... wählen In beiden Fällen, erscheint nach der Dateiauswahl der Import Wizard. Im Folgenden importieren wir eine Excel-Datei (temperatures.xls), welche einen fiktiven Temperaturverlauf für den Jänner 2012 beinhaltet. Dazu haben wir folgende Spalten: Datum (bereits in eine Zahl konvertiert) Mittlere Tagestemperatur Tagestiefstwerte Tageshöchstwerte M. Liedlgruber Anwendungssoftware III (MATLAB) SS 2014 18 / 32
importieren Wichtig: um die einzelnen Spalten als einzelne Variablen zu importieren (Vektoren), muss die entsprechende Option im Dialog ausgewählt werden. Formatierung Nach erfolgreichem Import sehen wir die Variablen im Workspace Browser. M. Liedlgruber Anwendungssoftware III (MATLAB) SS 2014 19 / 32
importieren Formatierung Abschließend müssen wir nun noch die Datumswerte korrigieren. MATLAB und Excel interpretieren numerische Datumswerte unterschiedlich: MATLAB: Anzahl der Tage seit dem 1. Jänner 0000 Excel: Anzahl der Tage seit dem 1. Jänner 1900 Daher müssen wir die Datumswerte noch korrigieren. Dazu addieren wir den 31. Dezember 1899 zu den importierten Datumswerten indate (mit Hilfe der Funktion datenum): Date = Date + datenum( 30DEC1899 ); Hinweis: da die Angabe der Tage beidatenum bei 0 startet, geben wir30 statt 31 ein. Um die korrigierten Zahlenwerte als Datumswerte auszugeben, gibt es die MATLAB-Funktion datestr: >> datestr(date(1)) ans = 01-Jan-2012 % Korrektur erfolgreich! M. Liedlgruber Anwendungssoftware III (MATLAB) SS 2014 20 / 32
importieren Formatierung Import von über die Kommandozeile Alternativ zum Import Wizard, kann man auch den Befehlxlsread verwenden, um einzulesen. Für unsere Testdateitemperatures.xls: data = xlsread( temperatures.xls ); Dieses Kommando liest den Inhalt des ersten Tabellenblattes in die Matrixdata. Um ein Arbeitsblatt mit dem NamenArbeitsblattname einzulesen, gibt man folgendes ein: data = xlsread( temperatures.xls, Arbeitsblattname ); Fürxlsread gibt es noch zahlreiche Optionen (z.b. Importbereich wählen oder Arbeitsblatt wählen). Eine ausführliche Beschreibung dieser Möglichkeiten ist in der MATLAB-Hilfe zu finden (doc xlsread). Zusätzliche Informationen zu einer Excel-Datei (z.b. Namen von Arbeitsmappen) können mit Hilfe des Kommandosxlsfinfo ausgegeben werden (siehe doc xlsfinfo). M. Liedlgruber Anwendungssoftware III (MATLAB) SS 2014 21 / 32
importieren Formatierung (Comma Separated Values) sind, welche Werte enthalten, die durch ein bestimmtes Spaltentrennzeichen getrennt sind (üblicherweise, oder;). Die Temperaturdaten aus Excel könnten im CSV-Format zum Beispiel wie folgt aussehen: 40909,1.1,0.2401943739,1.9598056261 40910,-3.2,-4.0770937883,-2.3229062117 40911,-3.1,-3.99331443,-2.20668557 40912,0.1,-0.8084478088,1.0084478088... Hinweis: für einen Import von in MATLAB, muss als Dezimaltrennzeichen immer ein Punkt verwendet werden. Um eine CSV-Datei in MATLAB zu importieren gibt es wieder zwei Möglichkeiten: über den Import Wizard über den Befehlcsvread M. Liedlgruber Anwendungssoftware III (MATLAB) SS 2014 22 / 32
importieren Formatierung Import einer CSV-Datei mit dem Import Wizard Die Auswahl der CSV-Datei funktioniert wie beim Import von. Im Import-Wizard kann man das gewünschte Trennzeichen angeben: Ist alles korrekt eingestellt, kann man nach einem Klick auf Next, den Namen der Variable(n) angeben, in welche die Daten importiert werden sollen. Enthält die CSV-Datei Spaltenbeschriftungen, kann automatisch für jede Spalte ein Vektor angelegt werden. Ansonsten wird eine Matrix erzeugt. M. Liedlgruber Anwendungssoftware III (MATLAB) SS 2014 23 / 32
importieren Formatierung Import einer CSV-Datei mitcsvread Mit dem Befehlcsvread können von der Konsole aus importiert werden. Wichtig Im Gegensatz zum Import Wizard wird in diesem Fall ein Beistrich als Spaltentrennzeichen vorausgesetzt. Zudem darf die CSV-Datei keine Spaltenbeschriftungen enthalten. Die Dateitemperature.csv wird folgenderweise importiert: >> A = csvread( temperatures.csv ); Will man den Import bei einer bestimmten Zelle (Position) starten, erreicht man dies mittels: >> A = csvread( temperatures.csv, 4, 3); In diesem Beispiel beginnt der Import mit der 5. Zeile und der 4. Spalte (Indizes starten bei 0!). M. Liedlgruber Anwendungssoftware III (MATLAB) SS 2014 24 / 32
importieren Formatierung Zudem kann man auch einen Bereich angeben, welcher importiert werden soll. Zum Beispiel: >> A = csvread( temperatures.csv, 0, 2, [0 2 7 3]); In diesem Beispiel werden die 3. und 4. Spalte und die 1. Zeile bis zur 8. Zeile importiert (Indizes wieder 0-basierend). Der zweite und der dritte Parameter (Startzelle) sollten dabei dem Startpunkt des angegebenen Bereichs entsprechen (in unserem Beispiel [0 2]). Hinweis: für mehr Kontrolle über den Import existiert noch das Kommando dlmread (siehedoc dlmread). M. Liedlgruber Anwendungssoftware III (MATLAB) SS 2014 25 / 32
importieren Formatierung Liegen Daten in einer Textdatei vor, kann der Import auch mit Hilfe des Kommandos textread erfolgen: >> A = textread( temperatures.txt ); Dieses Kommando liest den Inhalt der Datei in die MatrixAein. Das Format der Textdatei sollte dabei so einfach wie möglich gehalten werden (in unserem Beispiel wurde ein Leerzeichen als Spaltentrenner benutzt): 40909 1.1 0.2401943739 1.9598056261 40910-3.2-4.0770937883-2.3229062117 40911-3.1-3.99331443-2.20668557 40912 0.1-0.8084478088 1.0084478088... Das Kommandotextread unterstützt aber noch viele andere Formate (über eine Formatanweisung). Nähere Informationen dazu findet man in der MATLAB-Hilfedoc textread. M. Liedlgruber Anwendungssoftware III (MATLAB) SS 2014 26 / 32
MATLAB importieren Formatierung MATLAB hat auch ein eigenes Dateiformat um Daten zu speichern (). beinhalten sowohl den Namen als auch den Wert von Variablen. Es ist daher nicht notwendig, beim Laden eines einen Variablennamen anzugeben. Geladen wird ein mat-file mit dem Befehlload. Das folgende Beispiel lädt die Dateitest.mat und erstellt alle darin enthaltenen Variablen im Workspace: >> load test.mat Sind in der zu ladenden Datei z.b. die VariablenX,YundZenthalten, kann man auch nur bestimmte Variablen laden. Zum Beispiel: >> load test.mat Y Z Diese Anweisung erstellt nur die VariablenYundZaus der Dateitest.mat im Workspace. M. Liedlgruber Anwendungssoftware III (MATLAB) SS 2014 27 / 32
importieren Formatierung MATLAB bietet auch Funktionen, um zu laden. Dabei unterstützt MATLAB verschiedene Dateiformate, z.b. JPEG, PNG, BMP und TIFF. Will man ein Bild laden, verwendet man dazu den Befehlimread (Bild wird in eine Matrix geladen): >> I = imread( lena.jpg ); % bild laden >> imshow(i); % bild anzeigen Das Ergebnis ist folgende Figure: imshow ist einer von mehreren MATLAB-Befehlen, um ein Bild anzuzeigen (siehedoc imagesc,doc image unddoc imshow). M. Liedlgruber Anwendungssoftware III (MATLAB) SS 2014 28 / 32
exportieren Viele der Dateiformate, welche MATLAB importieren kann, können in MATLAB auch exportiert werden. Wir haben gesehen, dass man mit dem Kommandoxlsread einlesen kann. Um bestehende Daten in eine Excel-Datei zu exportieren, verwendet man den Befehlxlswrite. >> A = rand(100, 100); >> xlswrite( random.xls, A); Wie beixlsread, gibt es auch beixlswrite diverse Optionen. Eine ausführliche Beschreibung dieser Möglichkeiten ist in der MATLAB-Hilfe zu finden (doc xlswrite). Wichtig:xlswrite funktioniert nur unter Windows (mit einer Excel-Installation). Ist kein Excel installiert oder verwendet man Linux, versucht MATLAB, eine CSV-Datei zu erzeugen. M. Liedlgruber Anwendungssoftware III (MATLAB) SS 2014 29 / 32
exportieren Auch für gibt es ein Gegenstück zur Funktioncsvread nämlich die Funktioncsvwrite. Das folgende Beispiel zeigt, wie man Daten in eine CSV-Datei exportiert: >> A = rand(100, 100); >> csvwrite( random.csv, A); Auszug aus der resultierenden Datei: 0.99859,0.014034,0.59533,0.65084,0.45868,... 0.59436,0.66201,0.67865,0.29553,0.73434,...... Zu beachten: die Spalten sind immer durch ein Komma getrennt. es ist nur eine Präzision von fünf Nachkommastellen möglich (für mehr Präzision siehedoc dlmwrite). M. Liedlgruber Anwendungssoftware III (MATLAB) SS 2014 30 / 32
MATLAB exportieren Natürlich kann man auch Daten in ein mat-file speichern. Dazu wird der Befehl save verwendet. Dabei gilt zu beachten, dass das Kommandosave standardmäßig den kompletten Workspace in die angegebene Datei speichert: >> A = rand(100, 100); >> B = rand(100, 100); >> save test.mat Die Dateitest.mat enthält nun die VariablenAundB. Will man nur bestimmte Variablen speichern, muss man zusätzlich den Namen der zu speichernden Variable angeben. Zum Beispiel: >> A = rand(100, 100); >> B = rand(100, 100); >> C = rand(100, 100); >> save test.mat A C M. Liedlgruber Anwendungssoftware III (MATLAB) SS 2014 31 / 32
exportieren Um in MATLAB zu speichern, gibt es den Befehlimwrite. >> X = peaks(256)*30; >> imwrite(uint8(abs(x)), peaks.png, png ); Der erste Parameter gibt die Variable an, welche als Bild gespeichert werden soll (eine Matrix). Der dritte Parameter gibt das Dateiformat für das Bild an. Das Ergebnis ist folgendes Graustufenbild: Informationen zu weiteren Parametern und Optionen beiimwrite sind in der MATLAB-Hilfe zu finden (doc imwrite). M. Liedlgruber Anwendungssoftware III (MATLAB) SS 2014 32 / 32