Datei-Verarbeitung Eine Datei: ist ein benanntes Objekt im Dateisystem, ist eine lineare Anordnung einzelner Bytes, die geschrieben, bzw. gelesen werden können, kann vergrößert (Schreiben bzw. Anhängen), und auch verkleinert werden (Überschreiben mit kleinerem Inhalt, Abschneiden). Es wird eine Vielzahl unterschiedlicher Dateien im Dateisystem verwaltet. Das Dateisystem speichert Informationen über Dateien (Namen, Größe, Ort) und die enthaltene Daten auf einem nichtflüchtigen Speicher (Festplatte, Flash-Memory, SSD, Magnetband, CD/DVD/BlueRay, früher auch Diskette) Dateien können durch Anwungsprogramme erzeugt, verändert, gelesen, kopiert, verschoben und gelöscht werden Peter Sobe 60
Datei-Verarbeitung: Save, Load Matlab kann im interaktiven Modus Dateien benutzen: um Skripte und Funktionen in s.g. m-dateien zu speichern um den Workspace zu sichern und wiederherzustellen >> save mein_workspace_27_05_2014 alle Variablen (Namen, Typ und Werte) werden in der Datei mein_workspace_27_05_2014.mat gespeichert diese Datei hat einen Matlab-spezifischen Aufbau und kann nicht ohne weiteres durch andere Programme verarbeitet werden >> load 'workspace_27_05_2014 alle Variablen werden wiederhergestellt wie zum Zeitpunkt des save-befehls Peter Sobe 61
Datei-Verarbeitung: Save, Load Matlab kann im interaktiven Modus Dateien benutzen um einzelne, bzw. mehrere ausgewählte Variable zu sichern und wiederherzustellen >> [X,Y] = meshgrid(1:0.1:5, -1:0.1:+1); >> save matrizen_27_05_2014 X Y etwas später >> load matrizen_27_05_2014 die Variablen X und Y werden wiederhergestellt wie zum Zeitpunkt des save-befehls Ein anderes Beispiel: satz_der_woche='das ist der Satz, den sich keiner merken kann.'; >> save satz_der_woche; Es wird eine Datei satz_der_woche.mat angelegt >> load satz_der_woche; oder >> load satz_der_woche ; Peter Sobe 62
Datei-Verarbeitung: Save, Load Das Speichern und Laden einzelner Variablen ist auch innerhalb von Skripten sinnvoll einsetzbar. Matlab kann Daten in ASCII-Format exportieren. Dazu wird save mit der Option ASCII benutzt. Die entstehe Datei enthält die Daten einen textformat. Ein Beispiel-Skript folgt: werte=[]; while(1) % Zyklus wird durch break verlassen w=input('geben Sie bitte einen Wert ein (-1 für Ende):'); if (w==-1) break; werte = [werte w]; fprintf('eingabe wurde beet...\n'); save werte.txt werte -ASCII; fprintf('werte wurden nach werte.txt geschrieben\n'); Peter Sobe 63
Datei-Verarbeitung: Daten-Export Wie sehen exportierte Textdateien aus? V = [1 2 3 4]; M = [55 44; 33 66]; save vek.txt V -ASCII; save mat.txt M ASCII; vek.txt 1.0000000e+00 2.0000000e+00 3.0000000e+00 4.0000000e+00 mat.txt 5.5000000e+01 4.4000000e+01 3.3000000e+01 6.6000000e+01 Peter Sobe 64
Datei-Verarbeitung: Daten-Import Sind Daten als Textdatei in einer Reihe gespeichert, so können sie durch Matlab auf einen Vektor eingelesen werden. datenimport1.txt 12 13 12 13 14 12 12 10 9 11 >> load ASCII datenimport1.txt; whos datenimport1 1x10 80 double Sind Daten als Textdatei in mehreren Reihen gespeichert, so werden sie durch Matlab auf eine Matrix eingelesen. datenimport2.txt 12.5 13.4 15.1 11.2 >> load ASCII datenimport2.txt; whos datenimport1 1x10 80 double datenimport2 2x2 32 double Peter Sobe 65
Schrittweiser Zugriff auf Daten aus einer Datei Schrittweiser (sequentieller) Zugriff wird typischerweise in Skripten und Funktionen benutzt: Öffnen einer Datei mittels fopen Mehrfaches Lesen mit verschiedenen Funktionen, z.b. fgetl (file get line), oder fscanf (formatiertes Lesen auf eine oder mehrere Variablen) Schließen einer Datei mittels fclose Die Zugriffe werden über das s.g. Dateihandle (file handle) auf eine geöffnete Datei ausgerichtet. f = fopen('externedaten.txt'); % hier ist f das file handle zeile1 = fgetl(f); zeile2 = fgetl(f); fclose(f); Peter Sobe 66
Schrittweiser Zugriff auf Daten aus einer Datei variable = fscanf(file_handle, format); oder variable = fscanf(file_handle, format, dimesionsangabe); Format: %d für Integerzahl (nur ganzzahlige Werte) %f für Fließkommazahl %g für Fließkommazahl im wissenschaftlichen Format Fehlt die Dimensionsangabe, so versucht fscanf() die Variable als Spaltenvektor so lange wie möglich zu füllen. Beispiel: V = fscanf(f, %f ); M = fscanf(f, %f, [spalten, zeilen]); Peter Sobe 67
Schrittweiser Zugriff auf Daten aus einer Datei fprintf(file_handle, format, variablen); oder fprintf( format, variablen); % ohne file-handle bedeutet Ausgabe auf Konsole Beispiel: fprint(f1, %f,v); fprintf(f1, %f, M); Bei der Ausgabe werden die Dimensionen der Variablen berücksichtigt. Peter Sobe 68
Darstellung von Daten aus einer Datei Datei mit Daten: Skript: Geschwindigkeit nach Alter des Fahrers Alter der Fahrers Geschwindigkeit 18 55 22 51 23 63 22 50 50 52 44 55 19 44 f = fopen('externedaten.txt'); titelzeile = fgetl(f); x_beschriftung = fgetl(f); y_beschriftung = fgetl(f); Z = fscanf(f,'%g',[2,26]); plot(z(1,:),z(2,:),'*'); title(titelzeile); xlabel(x_beschriftung); ylabel(y_beschriftung); axis([10,85,0,80]); fclose(f); Peter Sobe 69
Darstellung von Daten aus einer Datei Erzeugter Plot: Peter Sobe 70
Eval Die eval-funktion führt den als Parameter übergebenen String (ausdruck) als Matlab-Anweisung aus. [ausgabe1, ausgabe2, ] = eval (ausdruck) Anwung: Übergabe von Berechungsvorschriften an Funktionen. Die Funktionen werden damit flexibilisiert. Zum Beispiel kann die Nullstellensuche durch das Intervallhalbierungsverfahren so als allgemeines Verfahren für verschiedene Funktionen entworfen werden. function [nst] = NSTSuche_eval (a,b, funktionsausdruck) m=(a+b)/2; % Quellcode nur Auszugsweise x=m; y = eval( funktionsausdruck); nst = m; Peter Sobe 71
Eval (Fortsetzung) Nullstellensuche mit Eval, Vollständige Funktion: function [nst] = NSTSuche_eval (a,b, funktionsausdruck) m=(a+b)/2; x=m; y = eval( funktionsausdruck); while abs(y)>0.000001 fprintf('m=%f y=%f \n ',m,y); if (y > 0) a = m; else b=m; nst=m; m=(a+b)/2; x=m; y = eval( funktionsausdruck); Aufruf: f_ausdruck= 0.3*cos(x+1)+sin((x+1)/2)-(x/5) ; nst = NSTSuche_eval (0,5, f_ausdruck); nst = 3.5658 Peter Sobe 72
Funktions-Handles Funktionshandles: Variablen, die eine Funktion speichern können. FH_winkelfun = @cos; % Funktionshandle FH_winkelfun speichert Verweis auf cos FH_winkelfun(pi/2) ans = 6.1232e-17 das ist praktisch Null FH_winkelfun = @sin; % Funktionshandle FH_winkelfun speichert Verweis auf sin FH_winkelfun(pi/2) ans = 1 Funktionshandles können die genutzten Funktionen flexibilisieren und auch als Übergabe an andere Funktionen benutzt werden. Peter Sobe 73
Eval (Fortsetzung) Nullstellensuche mit Funktionshandle, Vollständige Funktion: function [nst] = NSTSuche_fun_handle(a,b, F) m=(a+b)/2; y = F(m); while abs(y)>0.000001 fprintf('m=%f y=%f \n ',m,y); if (y > 0) a = m; else b=m; m=(a+b)/2; y = F(m) nst=m; Aufruf: nst = NSTSuche_fun_handle (0,5, @fun); nst = 3.5658 Peter Sobe 74