Mathematik am Computer - MATLAB Philipp Thomann Universität Stuttgart Institut für Stochastik und Anwendungen WS 2016/17 1 / 126 Inhaltsverzeichnis Einführung Grundlagen Programmierung Für Fortgeschrittene 2 / 126 Einführung I Was ist MATLAB? - Numerisches Berechnungs- und Simulationswerkzeug I Wofür steht MATLAB? - MATrix LABoratory I Was zeichnet MATLAB aus? - Matrizen-orientierte Datenstrukturen - einfach zu erlernende, mächtige Programmiersprache - großer Funktionsumfang (batteries included) - sehr gute Visualisierungsmöglichkeiten - ausführliche Dokumentation 3 / 126 Literatur I Frank Thuselt, Felix Paul Gennrich, Praktische Mathematik mit MATLAB, Scilab und Octave – für Ingenieure und Naturwissenschaftler. Berlin, Springer Verlag, 2013. [http://dx.doi.org/10.1007/978-3-642-25825-1 im Uni-Netz] I Ottmar Beucher, MATLAB und Simulink. München, Addison-Wesley Verlag, 2006. I Tutorialspoint MATLAB: http://www.tutorialspoint.com/matlab/matlab_pdf_version.htm I Alfio Quarteroni, Fausto Saleri, Wissenschaftliches Rechnen mit Matlab. Berlin, Springer Verlag, 2006. I Wolfgang Schweizer, MATLAB kompakt. München, Oldenbourg Wissenschaftsverlag, 2013. 4 / 126 Wissenswertes I Ende der 70er von Cleve Moler entwickelt I Mitte der 80er mit Jack Little umgeschrieben I Zunächst frei verfügbar, dann kommerziell unter MathWorks 5 / 126 Lizenz Studierende der Universität Stuttgart erhalten Lizenzen für MATLAB, siehe http://www.stud.uni-stuttgart.de/dienste/software/matlab.html Die Universität Stuttgart beteiligt sich an der Landeslizenz des Landes Baden-Württemberg. [. . . ] Studierende aller Fakultäten der Universität Stuttgart sind berechtigt, die Campuslizenz zu nutzen. Sie kann von den Studierenden der Universität Stuttgart auf beliebig vielen privaten Rechnern genutzt werden. Somit ist gewährleistet, dass eine optimale Verfügbarkeit auch außerhalb von Lehrveranstaltungen besteht. Es besteht eine Rahmenlizenz bis zum 30.3.2018. Die jährliche Laufzeit beginnt jeweils am 1. April eines Jahres. Sie wird innerhalb der Rahmenlizenz (Landeslizenz) vom TIK jährlich verlängert, sofern Mittel zur Verfügung stehen. Zur Nutzung der Matlab Lizenz müssen die folgenden Angaben bei der Erstellung eines Mathworks Accounts gemacht werden: I studentische E-Mail Adresse ([email protected] oder [email protected]) I Vorname I Nachname Falsche oder unvollständige Angaben des Namens können zum Ausschluss von der Nutzung der Matlab Campuslizenz führen, geben Sie also bitte unbedingt Ihren korrekten Namen an. 6 / 126 Open-Source-Alternativen Octave https://www.gnu.org/software/octave/ Octave achtet darauf, dass die Syntax mit Matlab austauschbar ist. Graphische Benutzeroberfläche sehr neu und mittlerweile standard. Scilab http://www.scilab.org/ Scilab hat teilweise leicht andere Syntax als MATLAB/Octave. Für Python gibt es mit pylab eine MATLAB-artige Umgebung (siehe Numpy/Matplotlib). Eine Alternative für Datenanalyse ist R (gute Oberfläche mit Rstudio). 7 / 126 Inhaltsverzeichnis Einführung Grundlagen Erste Schritte Hilfe Polynome Einfache Plots Indizierung von Matrixelementen Variablen Diagramme und 3D-Plots Programmierung Für Fortgeschrittene 8 / 126 Kommandooberfläche I Aufruf von der Konsole mit dem Kommando matlab & oder matlab -desktop & I Dreiteilige Kommandooberfläche: - Command Window Eingabe von MATLAB-Operationen und Befehlen Ausführung von Programmen und Skripten - Workspace Auflistung der vorhandenen Variablen - Current Folder Browser für aktuelles Verzeichnis - Später auch Plot/Editor/Dokumentation/Command History/. . . 9 / 126 Kommandooberfläche → mit Desktop I Aufruf von der Konsole mittels matlab & Scilab: scilab & Octave: octave & 10 / 126 Kommandooberfläche → ohne Desktop I Aufruf von der Konsole mittels matlab -nodesktop I Beenden mit exit Scilab: scilab-cli Octave: octave oder octave --no-gui & 11 / 126 SSH und X11-Forwarding (für Fortgeschrittene) Um gelegentlich MATLAB zu benutzen, können Sie sich mit SSH (Secure SHell) über das Internet auf jedem der Stud-Pool-Rechner einwählen. Sie müssen sich als Benutzer name auf einer der Maschinen studNN.mathematik.uni-stuttgart.de einloggen, hier wählen Sie eine Zahl NN zwischen 00 und 99 aus. Am einfachsten benutzen Sie die Kommandozeilen-Version matlab -nodesktop: I Unter Linux mit Terminal/Konsole, auf macOS mit Terminal: ssh [email protected] matlab -nodesktop I Unter Windows mit einer Installation von z.B. PuTTY (http://www.putty.org/) können Sie eine entfernte Sitzung erstellen und dann matlab -nodesktop aufrufen. Es ist auch möglich, die graphische Benuteroberfläche zu benutzen, die Interaktion fühlt sich aber je nach Verbindungsgeschwindigkeit sehr langsam an: I Unter Linux und macOS (auf letzterem muss je nachdem https://www.xquartz.org/ installiert werden): ssh -X [email protected] matlab I Unter Windows muss zusätzlich Xming installiert werden (http://www.straightrunning.com/XmingNotes/), und dann die entsprechende Konfiguration genutzt werden und dann matlab gestartet werden (vgl. http://courses.cms.caltech.edu/cs11/misc/xwindows.html). 12 / 126 Ein erstes Beispiel √ Wir approximieren >> x=3 x = 3 >> x = 1/2 x = 1.8333 >> x = 1/2 x = 1.4621 >> x = 1/2 x = 1.4150 >> x = 1/2 x = 1.4142 2 mit dem Heron-Verfahren: * (x + 2/x) * (x + 2/x) * (x + 2/x) * (x + 2/x) Im Command Window kann man mit Hilfe der Nach-Oben-Taste und Nach-Unten-Taste durch die vergangenen Befehle gehen. Man kann diese Zeile auch bearbeiten bevor sie erneut abgeschickt werden. MATLAB bietet uns natürlich eine eigene Funktion zur Berechnung der Quadratwurzel: >> sqrt(2) ans = 1.4142 13 / 126 Im Gegensatz zu den meisten Programmiersprachen/Taschenrechnern zieht MATLAB auch Quadratwurzeln aus negativen Zahlen: >> sqrt(-1) ans = 0.0000 + 1.0000i >> log(-1) ans = 0.0000 + 3.1416i >> exp(log(-1)) ans = -1.0000 + 0.0000i 14 / 126 Eingabe I Eingabe von (komplexen) Zahlen >> 123 ans = 123 >> 1.23 ans = 1.2300 >> 12i ans = 0.0000 + 12.0000i >> 1.23e-4 ans = 1.2300e-4 >> 0.000123 ans = 1.2300e-4 >> 12 + 3i ans = 12.0000 + 3.0000i >> 4j-123 ans = -1.2300e+02 + 4.0000e+00i >> 1.23 + 4.56e-3i ans = 1.2300 + 0.0046i I Ausgabe des Ergebnisses unterdrücken mit “;” >> i+j; >> i+j ans = 0.0000 + 2.0000i 15 / 126 Elementare Operatoren und Funktionen I arithmetische Operatoren +, -, *, /, \ (a\b entspricht b/a), ˆ (Potenz) I trigonometrische Funktionen (Winkelangaben in Bogenmaß) cos, sin, tan, cot, acos, asin, atan, sinh, cosh, ... I Exponential-, Logarithmus- und Wurzelfunktionen exp, pow2, log, log10, log2, sqrt, realsqrt, ... I Rechnen mit komplexen Zahlen abs, angle, conj, real, imag I Sonstige round, floor, fix, ceil, mod, rem, sign I Konstanten pi, exp(1), i, j 16 / 126 Elementare Operatoren und Funktionen I Beispiele zur Reihenfolge bei der Auswertung von Operatoren: >> 3^3^3 ans = 19683 >> (3^3)^3 ans = 19683 >> 3^(3^3) ans = 7.6256e+12 >> 12/3/4 ans = 1 >> 3\12/4 ans = 1 >> 16^1/2-16^(1/2) ans = 4 17 / 126 Ein Matrix-Beispiel Aus LAAG Blatt 8: Votieraufgabe 1. Bestimmen Sie mit Hilfe des Gauß-Algorithmus die Inverse der Matrix: 1 1 2 >> [1 1 2; ans = -0.2500 -0.2500 0.7500 >> [1 1 2; ans = 1 0 0 1 2 1 ! 2 1 1 1 2 1; 2 1 1]^-1 -0.2500 0.7500 0.7500 -0.2500 -0.2500 -0.2500 1 2 1; 2 1 1] * ans 0 1 0 0 0 1 18 / 126 Eingabe von Matrizen I Variable = [a11 , a12 , . . . , a1n ; a21 , a22 , . . . , a2n , . . . ] Elemente durch Komma oder Leerzeichen, Zeilen durch Semikolon oder Return getrennt. I Mehrzeilige Eingabe einer Zeile mit Fortsetzungspunkten "..." I Schachtelung möglich I Skalare und Vektoren als spezielle Matrizen I Manipulation durch Anklicken im Workspace 19 / 126 Eingabe von Matrizen >> v_col = [1;2;3], v_row = [1 2 3] v_col = 1 2 3 v_row = 1 2 3 >> A = [v_col,... [v_row;0,0,0;4 5 6] A = 1 1 2 2 0 0 3 4 5 v_col] 3 0 6 1 2 3 20 / 126 Spezielle Matrizen und Vektoren Matrizen: I ones(n,m): (n × m)-Matrix, bei der alle Einträge 1 sind I zeros(n,m): (n × m)-Matrix, bei der alle Einträge 0 sind I eye(n,m): (n × m)-Matrix, bei der alle Einträge auf der Hauptdiagonalen 1 und sonst 0 sind I rand(n,m): (n × m)-Matrix, deren Einträge gleichverteilte Pseudozufallszahlen zwischen 0 und 1 sind I randn(n,m): (n × m)-Matrix mit normalverteilten Pseudozufallszahlen mit Mittelwert 0 und Standardabweichung 1 Vektoren: I [a:b]: Ergibt den Vektor [a a+1 a+2 ... b] I [a:d:b]: Ergibt den Vektor [a a+d a+2d ... a+m*d] mit m=fix((b-a)/d), vorausgesetzt b ≥ a I linspace(a,b,n): Erzeugt einen äquidistant unterteilten (1 × n)-Vektor mit erstem Element a und letztem Element b. → Abstand zwischen Elementen: (b − a)/(n − 1). 21 / 126 Matrix-Operationen I A+B: Addition von Matrizen I A-B: Subtraktion von Matrizen I A*B: Matrixmultiplikation I Aˆn: n-te Potenz I A’: Transponierte einer Matrix I X=A\B: Lösung des linearen Gleichungssystems AX = B I X=B/A: Lösung des linearen Gleichungssystems XA = B I A.*B, A.ˆn: punktweise Operationen 22 / 126 Beispiel % Lösen eines linearen Gleichungssystems >> A = [1 2;3 4]; b = [5;-6]; >> x = A\b x = -16.0000 10.5000 >> format long >> A*x ans = 4.999999999999998 -6.000000000000000 23 / 126 Beispiel % Matrix-Operationen >> A = [0 1 2;3 4 5]; y = [-1; -2]; >> A + [y y y] ans = -1 0 1 1 2 3 >> B = y*y’ B = 1 2 2 4 >> [B^2 B.^2] ans = 5 10 1 4 10 20 4 16 24 / 126 Matrix-Funktionen Übersicht: help matfun I Größe von Vektoren und Matrizen: length, size I Elementare Matrixfunktionen: max, min, sum, sort, diff, norm, rank, det, trace, null. I Lineare Gleichungssysteme: inv, cond, chol, lu, qr, pinv I Eigen- und Singulärwerte: eig, svd, poly, expm, logm 25 / 126 Beispiel % Matrix-Funktionen >> A = [0 4 2;3 1 5] ans = 0 4 2 3 1 5 >> [m,n] = size(A) m = 2 n = 3 >> max(A), sum(A), sort(A) ans = ans = 3 4 5 3 >> max(A’), sum(A’), sort(A’) ans = ans = 4 5 6 5 7 9 ans = 0 3 ans = 0 2 4 1 4 2 5 1 3 5 >> max(max(A)), sum(sum(A)) ans = ans = 5 15 26 / 126 Zahlen sind Matrizen >> size(42) ans = 1 1 D.h. alle Funktionen verstehen sich auf Matrizen/Vektoren: >> sin([0 1 pi/2 pi]) ans = 0 0.8415 1.0000 0.0000 27 / 126 Darstellungsformate format Stil: Wählt Ausgabeformat Für Zahldarstellung I short: skalierte Festpunktdarstellung mit 5 Stellen (default) I long: skalierte Festpunktdarstellung mit 15 Stellen I short e: Gleitpunktdarstellung mit 5 Stellen I long e: Gleitpunktdarstellung mit 15 Stellen I short g: optimale Darstellung mit 5 Stellen I long g: optimale Darstellung mit 15 Stellen I short eng: mindestens 5 Stellen und einen durch drei teilbaren Exponenten I long eng: 15 signifikante Stellen und einen durch drei teilbaren Exponenten I rat: Näherung in Bruchdarstellung Für Zeilenabstände: I loose: Leerzeilen in der Ausgabe zur Übersichtlichkeit (default) I compact: keine Leerzeilen, um Platz zu sparen 28 / 126 Inhaltsverzeichnis Einführung Grundlagen Erste Schritte Hilfe Polynome Einfache Plots Indizierung von Matrixelementen Variablen Diagramme und 3D-Plots Programmierung Für Fortgeschrittene 29 / 126 Hilfe Übersicht I help, help Thema, help Funktionsname Übersicht bzw. Hilfe zu Thema oder Funktion I lookfor Text Sucht Funktionen mit Text in deren Kurzbeschreibung I helpbrowser Dokumentation in HTML-Format I doc Thema, doc Funktionsname Beschreibung zu Thema oder Funktion 30 / 126 Hilfe Beispiel für help >> help rank RANK Matrix rank. RANK(A) provides an estimate of the number of linearly independent rows or columns of a matrix A. RANK(A,tol) is the number of singular values of A that are larger than tol. RANK(A) uses the default tol = max(size(A)) * eps(norm(A)). Class support for input A: float: double, single Overloaded methods: gf/rank Reference page in Help browser doc rank 31 / 126 Hilfe Beispiel für lookfor >> lookfor kernel ProbDistKernel - Probability distribution defined by kernel smoothing. ProbDistUnivKernel - Univariate kernel probability distribution. ltitr - Linear time-invariant time response kernel. fi_cordic_cart_polar_demo - Convert Cartesian to Polar Using CORDIC Vectoring Kernel fi_cordic_sincos_demo - Compute Sine and Cosine Using CORDIC Rotation Kernel integralKernel - Define filter for use with integral images. ltifr - Linear time-invariant frequency response kernel. visionRecovertformCodeGeneration_kernel - Kernel for Feature Matching and Registration ksdensity - Compute kernel density or distribution estimate 32 / 126 Hilfe Beispiel für doc doc rank 33 / 126 Inhaltsverzeichnis Einführung Grundlagen Erste Schritte Hilfe Polynome Einfache Plots Indizierung von Matrixelementen Variablen Diagramme und 3D-Plots Programmierung Für Fortgeschrittene 34 / 126 Polynome Ein Polynom vom Grad n besitzt n + 1 Koeffizienten, es kann also kodiert werden mit Hilfe eines Vektors der Dimension n + 1. MATLAB nummeriert die Koeffizienten beginnend mit dem Leitkoeffizienten: P(1) x n + P(2) x n−1 + · · · + P(n) x + P(n + 1). Die gebräuchlichsten Dinge, welche mit Polynomen mit Koeffizienten im Vektor P gemacht werden: I polyval(P,X): Auswertung an der Stelle X I roots(P): Bestimmung der Nullstellen eines Polynoms I polyder(P): Ergibt die Koeffizienten der Ableitung eines Polynoms I polyfit(X,Y,n): Bestimmung eines Polynoms P n-ten Grades, welches die Daten Y am besten (im „least-square-Sinn“ ) approximiert 35 / 126 Beispiel % Rechnen mit Polynomen, Interpolation der Daten (x, cos(x pi)) >> x = [0:3]; y = cos(x*pi); p = polyfit(x,y,3) p = -1.3333 6.0000 -6.6667 1.0000 % Nullstellen >> xz = roots(p)’ xz = 2.8229 1.5000 0.1771 % Mit ’ wird der Vektor transponiert (in einer Zeile) angezeigt % Koeffizienten der Ableitung und Extremwerte >> dp = polyder(p) dp = -4.0000 12.0000 -6.6667 >> xe = roots(dp)’ xe = 2.2638 0.7362 >> ye = polyval(p,xe) ye = 1.1881 -1.1881 36 / 126 Inhaltsverzeichnis Einführung Grundlagen Erste Schritte Hilfe Polynome Einfache Plots Indizierung von Matrixelementen Variablen Diagramme und 3D-Plots Programmierung Für Fortgeschrittene 37 / 126 Darstellung von Funktionen und Kurven I plot: Zeichnen von Polygonzügen I semilogx, semilogy: logarithmische Skalierung in x- bzw. y -Richtung I loglog: logarithmische Skalierung in x- und y -Richtung I polar: Darstellung in Polarkoordinaten Aufrufvarianten: plot(X,Y), plot(X,Y,S), plot(X1,Y1,S1,X2,Y2,S2,...) Die Daten liegen dabei in der Form (x1 , y1 ), (x2 , y2 ), ... vor Zusätzlich gibt es einen optionalen Formatstring S mit drei möglichen Zeichen für I Farbe: b (blau), g (grün), r (rot), y (gelb), k (schwarz), ... I Kennzeichner: ., o, x, +, *, <, >, ... I Linienstil: -, --, :, -. Analog: Zeichnen räumlicher Polygonzüge mit plot3(X,Y,Z,S) Interaktiv auch mit dem Plots Tab im Toolstrip. 38 / 126 Beispiel Trigonometrische Funktionen y = sin(x) und z = cos(x) auf dem Intervall [−3, 3] >> >> >> >> x = linspace(-3,3); y = sin(x); z = cos(x); plot(x,y,x,z); 1 0.8 0.6 0.4 0.2 0 −0.2 −0.4 −0.6 −0.8 −1 −3 −2 −1 0 1 2 3 39 / 126 Plots von Polynomen Grafische Darstellung des Polynoms y = x 3 − 8x 2 + 6x − 1 >> >> >> >> >> >> >> >> x = [-1:0.01:7]; c = [1 -8 6 -1]; y = polyval(c,x); dc = polyder(c); dy = polyval(dc,x); xe = roots(dc); ye = polyval(c,xe); plot(x,y,’b’,x,dy,’r’,xe,ye,’o’,’LineWidth’,2) 40 / 126 Modifikation des Koordinatensystems Beschriftung von Grafiken (LATEX-Notation) title xlabel, ylabel, zlabel text gtext legend colorbar Überschrift der Grafik Achsenbeschriftungen beliebig positionierbarer Text grafische Textpositionierung (z.B. mit einer Maus) Legende Farblegende Modifikation der Achsen axis grid, box zoom pbaspect view Grenzen, Skalierung Gitterlinien Vergrößerung von Bereichen Verhältnis der Achsenlängen Blickwinkel 41 / 126 Beschriftung von Grafiken x = linspace(0,2*pi); plot(x,[sin(x);cos(x)]) title(’Trigonometrische Funktionen’) xlabel(’Winkel \alpha’) ylabel(’Funktionswerte’) text(pi/4,sin(pi/4),’ sin \pi/4 = cos \pi/4’) legend(’sin \alpha’,’cos \alpha’,’Location’,’EastOutside’) axis equal axis tight Trigonometrische Funktionen 1 sin π/4 = cos π/4 Funktionswerte >> >> >> >> >> >> >> >> >> 0.5 sin α cos α 0 −0.5 0 1 2 3 Winkel α 4 5 6 42 / 126 Brownsche Bewegung >> >> >> >> >> >> dt = .01; t = 0:dt:5; increments = randn(size(t)) * sqrt(dt); x = cumsum(increments); plot(t,x) xlim([-3,3]) 3 2 1 0 -1 -2 -3 0 2 4 43 / 126 2-dimensionale Brownsche Bewegung >> >> >> >> >> >> dt = .01; t = 0:dt:5; x = cumsum(randn(size(t)) * sqrt(dt)); y = cumsum(randn(size(t)) * sqrt(dt)); plot(x,y) axis([-3 3 -3 3]) 3 2 1 0 -1 -2 -3 -2 0 2 44 / 126 Inhaltsverzeichnis Einführung Grundlagen Erste Schritte Hilfe Polynome Einfache Plots Indizierung von Matrixelementen Variablen Diagramme und 3D-Plots Programmierung Für Fortgeschrittene 45 / 126 Indizierung von Matrixelementen Zugriff auf Matrixblöcke mit Indexvektoren I A(Z,S): Teilmatrix mit den Elementen der durch die Zeilenvektoren Z bzw. Spaltenvektoren S indizierten Elementen I A(K): Vektor der durch den Indexvektor K bei spaltenweiser Nummerierung indizierter Elemente: Stehender Vektor, falls K ein stehender Vektor ist, andernfalls liegend Zugriff auf alle Zeilen/Spalten mit Z = 1 : end bzw. S = 1 : end oder abgekürzt mit ” : ” als Index Zuweisungsmöglichkeiten: I Teilmatrix = Skalar : Alle indizierten Elemente werden durch den Skalar ersetzt I Teilmatrix = Matrix: Ersetzen der indizierten Teilmatrix durch die gegebene Matrix gleicher Größe I Teilmatrix = [ ]: Löschen der indizierten Spalten und/oder Zeilen 46 / 126 Indizierung von Matrixelementen >> A = [11 12 13 14 15 16 17 18 19; 21 22 23 24 25 26 27 28 29]; >> A(2,7) ans = 27 >> A(1,[3 7 1]) ans = 13 17 11 >> A(1,[3 7 end]) ans = 13 17 19 >> A(1,[3 7 end-1]) ans = 13 17 18 >> A([5 9 end]) ans = 13 15 29 >> A([5 9 end-1]) ans = 13 15 19 >> A(:,2:2:end) ans = 12 14 16 22 24 26 18 28 47 / 126 Indizierung von Matrixelementen >> A(:,1:3:end) = [] A = 12 13 15 16 18 19 22 23 25 26 28 29 >> A(:,3:4) = 0 A = 12 13 0 0 18 19 22 23 0 0 28 29 >> A(:,[1:2,end-1:end])=ones(2,4) A = 1 1 0 0 1 1 1 1 0 0 1 1 48 / 126 Logische Ausdrücke zum Indizieren >> A = [0 4 2 ; 3 1 5] A = 0 4 2 3 1 5 >> A > 2 ans = 0 1 0 1 0 1 >> A(A>2) ans = 3 4 5 >> A(A>2)=-1 A = 0 -1 2 -1 1 -1 49 / 126 Logische Vergleichsoperatoren und Verknüpfungen Vergleichsoperatoren == ~= < > <= >= gleich ungleich kleiner größer kleiner oder gleich größer oder gleich Verknüpfungen & | ~ und oder nicht Verknüpfungen für logische Skalare && || und oder (rechtes Argument nur ausgewertet wenn nötig!) Klammerung relevant >> ((pi <= 3) & ~floor(0.5)) | exp(1)~=2.71 ans = 1 >> (pi <= 3) & (~floor(0.5) | exp(1)~=2.71) ans = 0 50 / 126 Man kann auch die Indizes suchen, an denen die logische Variable wahr ist: >> A = [0 4 2 ; 3 1 5] A = 0 4 2 3 1 5 >> find(A>2) ans = 2 3 6 >> [row,col] = find(A>2) row = 2 1 2 col = 1 2 3 51 / 126 Inhaltsverzeichnis Einführung Grundlagen Erste Schritte Hilfe Polynome Einfache Plots Indizierung von Matrixelementen Variablen Diagramme und 3D-Plots Programmierung Für Fortgeschrittene 52 / 126 Variablen I Name aus Buchstaben, Ziffern und dem Zeichen _ (case sensitive) I Wertzuweisung: Variable = Ausdruck I Befehle I who bzw. whos: Liste der definierten Variablen I clear Variablennamen, clear: löscht Variablen bzw. alle Variablen I save Dateiname [Variablen]: speichert alle [bzw. die angegebenen Variablen] in Datei Dateiname.mat I load Dateiname [Variablen]: lädt alle [bzw. die angegebenen Variablen] von Datei Dateiname.mat I disp(X): Ausgabe von Zeichenketten und Variablen 53 / 126 Variablen >> clear >> Radius = 4 >> Flaeche = pi*radius^2 Undefined function or variable ’radius’. Did you mean: >> Radius >> Flaeche = pi*Radius^2; >> Flaeche = 50.2655 >> who Your variables are: Flaeche Radius 54 / 126 Logische Variablen Variablen mit Werten true (enspricht 1) und false (entspricht 0) >> x = true x = 1 Ergeben sich als Auswertung eines logischen Ausdrucks >> x = 5 > 1 x = 1 55 / 126 MATLAB speichert Zahlen standardmäßig im Gleitpunktformat (floating point): f = ±1 · 1.mantisse · 2exponent−102310 . Bei double precision werden 64 Bit verwendet: Vorzeichen 1 Bit, Exponent 11 Bit, Mantisse 52 Bit. Als Beispiel mit mantisse = 011012 und exponent = 100000000102 f = 1.011012 · 2100000000102 −102310 = 1011.012 = 11.2510 I Darstellbare Zahlen (Betrag) im Bereich [2.2251e − 308; 1.7977e + 308] >> realmax, realmin ans = ans = 1.7977e+308 2.2251e-308 I eps: Abstand zwischen 1 und nächstgrößerer darstellbarer Zahl >> eps ans = 2.2204e-16 >> 1 + 0.5*eps ans = 1 >> 1 + 0.5*eps==1 ans = 1 >> 1 + 0.6*eps==1 ans = 0 56 / 126 Spezielle Konstanten I Spezielle Zahlen I inf: Überlauf (∞) >> 2*realmax ans = Inf I nan: Resultat mathematisch nicht definierter Operationen >> 0.0/0.0 ans = NaN I i, j: komplexe Einheit 57 / 126 Inhaltsverzeichnis Einführung Grundlagen Erste Schritte Hilfe Polynome Einfache Plots Indizierung von Matrixelementen Variablen Diagramme und 3D-Plots Programmierung Für Fortgeschrittene 58 / 126 Diagramme I Balkendiagramme bar(Y): Werte Y(k,:) als Balkengruppe über k I Histogramme hist(y,x): Verteilung der Daten y, getrennt nach x I Tortendiagramme pie(Y): Häufigkeit durch Tortenstücke dargestellt Beispiel x = [-3:0.1:3]; y = randn(10000,1); hist(y,x) hist(y,100) 59 / 126 Beispiel Y = round(rand(5,3)*10); subplot(2,2,1) bar(Y,’grouped’) title ’Group’ subplot(2,2,2) bar(Y,’stacked’) title ’Stack’ subplot(2,2,3) barh(Y,’stacked’) title ’Stack’ subplot(2,2,4) bar(Y,1.5) title ’Width = 1.5’ 60 / 126 Darstellung bivariater Funktionen und Flächen I mesh(X,Y,Z,C): Zeichnen eines Flächennetzes I surf(X,Y,Z,C), surfl(X,Y,Z,V): Zeichnen einer Fläche bzw. einer beleuchteten Fläche Argumente: I Matrizen X , Y und Z von Koordinaten → schachbrettförmiges Viereckgitter beschrieben durch X und Y I Matrix C mit optionalen Farbwerten I Vektor V , welcher die Richtung der Lichtquelle angibt Erzeugung des Viereckgitters: I [X,Y] = meshgrid(x,y) 61 / 126 Beispiel Zeichne die Funktion z = x 2 + y 2 auf [0, 2] × [0, 3] >> [X,Y] = meshgrid(0:2,0:3) X = 0 1 2 0 1 2 0 1 2 0 1 2 Y = 0 0 0 1 1 1 2 2 2 3 3 3 >> Z = X.^2 + Y.^2; >> mesh(X,Y,Z,’LineWidth’,2) 15 10 5 0 3 2 2 1.5 1 1 0.5 0 0 62 / 126 Beispiel >> [X,Y,Z] = peaks(100); >> surf(X,Y,Z); >> shading interp; 63 / 126 Schnittbilder contour(x,y,z,n) (n natürliche Zahl) gibt ein Schnittbild mit n Höhenlinien, die automatisch bestimmt werden contour(x,y,z,v) (v Vektor) gibt ein Schnittbild mit Höhenlinien, die v entnommen werden clabel zur Beschriftung >> [x,y,z]=peaks(100); >> [c,h]=contour(x,y,z,8); >> clabel(c); >> [x,y,z]=peaks(100); >> [c,h]=contourf(x,y,z,-6:2:8); >> clabel(c); 64 / 126 Sound >> >> >> >> Fs = 8192; t = linspace(0,4,4*Fs); y = sin(2*pi*t*440); sound(y,Fs) >> load gong >> sound(y) 65 / 126 Inhaltsverzeichnis Einführung Grundlagen Programmierung Programmierung Funktionen Datei-Ausgabe Für Fortgeschrittene 66 / 126 MATLAB-Script-Dateien Längere Befehlssequenzen, welche immer wieder ausgeführt werden sollen, können in MATLAB-Script-Dateien gespeichert werden: I Speicherung von MATLAB-Befehlen in Textdatei DATEINAME.m I Ausführung der Befehle: >> DATEINAME I Ablaufsteuerung: pause echo on, echo off Unterbrechung der Programmausführung Anzeige der Befehle ein bzw. ausschalten I Kommentare: % TEXT einzeiliger Kommentar %{ TEXT %} mehrzeiliger Kommentar 67 / 126 Übersicht über Ablaufstrukturen Beim Programmieren ist es wichtig, den Ablauf steuern zu können. Dies geschieht meistens mit den folgenden Strukturen: I if-Abfrage I for-Schleife I while-Schleife I switch-Anweisung Das Konzept eines Programmes wird Algorithmus genannt (zu Ehren des iranischen Mathematikers al-Chwarizmi). 68 / 126 if-Abfrage Die einfachste Syntax ist: if logischer Ausdruck Befehle end Häufig verwendet wird die Dichotomie: if logischer Ausdruck Befehle else Befehle end 69 / 126 Gibt es noch mehr Fälle, verwendet man: if logischer Ausdruck Befehle elseif logischer Ausdruck Befehle elseif logischer Ausdruck Befehle elseif logischer Ausdruck Befehle else Befehle end Nützliche Indikatorfunktionen für logische Ausdrücke: isempty, isstr, ischar, isinf, isnan, isfinite. Achtung: In MATLAB kann es schnell passieren, dass der logische Ausdruck ein logischer Vektor ist, ohne dass einem das bewusst war! Ein Vektor wird als wahr gewertet, wenn er nicht-leer ist und alle Einträge ungleich 0 sind. In dieser Situation empfiehlt es sich, && und || zu verwenden. 70 / 126 Beispiel Bestimme das Signum einer Zahl x ( s(x) = 1, 0, −1, falls x > 0, falls x = 0, falls x < 0. Bestimmung von s(x) mit MATLAB if x > 0 s = 1; elseif x < 0 s = -1; else s = 0; end Alternativ: s = (x>0) - (x<0); s = sign(x); 71 / 126 for-Schleife Syntax: for Variable = Ausdruck Befehle end I Ausdruck kann Matrix sein. I Variable durchläuft Matrix spaltenweise; standardmäßig beginnend mit der ersten Spalte. Unterbrechung der Befehlssequenz: break continue Abbruch der (innersten) Schleife nächste Iteration 72 / 126 Beispiel Monte-Carlo Schätzung der Kreiszahl π ≈ 3.1416. Algorithmus: I Wähle zufällig N Punkte (p1 , p2 ) ∈ [0, 1)2 I Bestimme die Anzahl n der Punkte mit p2 + p2 < 1 1 2 Wir erwarten: π/4 ≈ n/N Um zu zeigen, dass for-Schleifen in MATLAB häufig nicht besonders effizient sind, vergleichen wir Laufzeiten von mehreren Alternativen. Dies geschieht mit: tic (Start der Stoppuhr) toc (Anhalten der Stoppuhr) 73 / 126 Monte-Carlo I Implementierung mit einer for-Schleife über die Anzahl der Tests tic N = 1e6; n = 0; for k = 1:N p = rand(2,1); n = n + (p(1)^2 + p(2)^2 < 1); end pi = 4*n/N toc Ausgabe: (variiert mit Zufallszahlen) pi = 3.1412 Elapsed time is 2.025549 seconds. 74 / 126 Monte-Carlo II Implementierung mit einer for-Schleife über die Spalten einer Zufallspunktematrix tic N = 1e6; n = 0; for p = rand(2,N) n = n + (p(1).^2 + p(2).^2 < 1); end pi = 4*n/N toc Ausgabe: (variiert mit Zufallszahlen) pi = 3.1429 Elapsed time is 0.866843 seconds. 75 / 126 Monte-Carlo III Implementierung ohne for-Schleife tic N = 1e6; P = rand(2,N); n = sum(P(1,:).^2 + P(2,:).^2 < 1); pi = 4*n/N toc Ausgabe: (variiert mit Zufallszahlen) pi = 3.1426 Elapsed time is 0.066896 seconds. 76 / 126 Monte-Carlo IV Implementierung mit Parallelisierung: tic N = 1e6; cpus = 2; parfor i=1:cpus P = rand(2,N/cpus); n(i) = sum(P(1,:).^2 + P(2,:).^2 < 1); end pi = 4*sum(n)/N toc Ausgabe: (variiert mit Zufallszahlen) pi = 3.1415 Elapsed time is 0.071186 seconds. 77 / 126 while-Schleife Syntax: while logischer Ausdruck Befehle end Unterbrechung der Befehlssequenz: break continue Abbruch der (innersten) Schleife nächste Iteration Vorsicht: Gefahr von Endlos-Schleifen, falls logischer Ausdruck nie false wird. 78 / 126 Beispiel Babylonisches Wurzelziehen zur Bestimmung der positiven Nullstelle der Funktion f (x) = x 2 − a Algorithmus: I Wähle Startwert x0 I Bestimme Folgenglieder xk +1 = 1 (x 2 k + a xk ) a = 2; n = 0; x = 2; tol = 1e-12; maxiter = 1e6; while abs(x^2 - a) > tol x = (x+a/x)/2; n = n+1; if n > maxiter break end end x Ausgabe: x = 1.4142 79 / 126 switch-Anweisung Syntax: switch Ausdruck case Wert Befehle case { Wert1,Wert2,...} Befehle otherwise Befehle end Wert von Ausdruck : skalare Größe oder Zeichenkette ({...} bezeichnet einen Cell-Array, siehe später) 80 / 126 Beispiel Ausgabe von Informationen über eine Zahl n zwischen 1 und 9: switch n case {1,4,9} disp(’Die Zahl ist eine Quadratzahl’); case {2,3,5,7} disp(’Die Zahl ist eine Primzahl’); case 6 disp(’Die Zahl hat zwei Primfaktoren: 2 und 3’); case 8 disp(’Die Zahl ist eine Kubikzahl’); otherwise disp(’n muss eine natürliche Zahl zwischen 1 und 9 sein’); end 81 / 126 Inhaltsverzeichnis Einführung Grundlagen Programmierung Programmierung Funktionen Datei-Ausgabe Für Fortgeschrittene 82 / 126 Funktionen Eine Funktion in MATLAB erhält Parameter und gibt Rückgabewerte: y = sin(pi) [n,m] = size( [1 2 3; 4 5 6] ) Es ist äusserst einfach eigene Funktionen zu schreiben: I Speichere eine Textdatei FUNKTIONSNAME.m im aktuellen Verzeichnis I Aufbau der Funktions-Datei: function [Rückgabevariablen] = FUNKTIONSNAME(Parameter ) % Kurzbeschreibung für Stichwortsuche % Beschreibung Befehle Weitere Funktionen, welche aber nur innerhalb dieser Datei bestehen. I Vorzeitiges Verlassen der Funktion durch return I Rückgabevariablen und Parameter optional function w = f(x) % Sinus in Grad. w = sin(x * pi / 180); 83 / 126 Beispiel Binomialkoeffizient n n · (n − 1) · · · (n − k + 1) = k k · (k − 1) · · · 2 · 1 function c = binomial(n,k) % binomial coefficient % c = binomial(n,k) % n,k: nonnegative integers with k <= n % c: n choose k if k < 0 || k > n || n < 0 error(’invalid input’); end c = 1; for m = 1:k c = c*(n+1-m)/m; end 84 / 126 Beispiel Aufruf: >> c = binomial(5,2) c = 10 >> binomial(3,4) invalid input >> binomial(4,3) ans = 4 85 / 126 Funktionen Darstellung der Kommentare im Funktionskopf mittels help: >> help binomial binomial coefficient c = binomial(n,k) n,k: nonnegative integers with k <= n c: n choose k 86 / 126 Beispiel Variante mit Unterfunktion n n! = (n − k )! k ! k function c = binomial(n,k) c = fakultaet(n)/(fakultaet(n-k)*fakultaet(k)); function p = fakultaet(m) p = 1; for k = 2:m p = p*k; end Variante mit Rekursion n = k 1 n−1 k −1 + n−1 k n = 0 oder k = 0 oder k = n sonst function c = binomial(n,k) if n==0 || k == 0 || k == n c = 1; else c = binomial(n-1,k-1) + binomial(n-1,k); end 87 / 126 Dualdarstellung Rekursives MATLAB-Programm d = dual(n), das die Dualdarstellung einer natürlichen Zahl berechnet. Hinweis: Die letzte Stelle in der Dualdarstellung entspricht dem Rest bei Division durch 2. Wird dieser von der Zahl abgezogen, kann diese durch 2 dividiert werden. Die vorletzte Stelle kann nun entsprechend ermittelt und das Verfahren iteriert werden. Algorithmus: I Überprüfen, ob n > 1 I Den Rest d von n geteilt durch zwei finden und speichern I n den Wert von (n − d)/2 zuweisen I Rekursion mit dem neuen Wert von n I Die Reste ausgeben function d=dual(n) if n > 1 d=mod(n,2); n=(n-d)/2; d=[dual(n),d]; else d=n; end 88 / 126 Funktionen als Kommandos Kommandos wie help, save, load, format etc. werden meist so aufgerufen: help sin save today load today MATLAB interpretiert dabei die Argumente als feste Zeichenketten getrennt durch Leerzeichen. Somit ist dies nichts anderes als ein Funktionsaufruf: help(’sin’) save(’today’) load(’today’) Generell können alle Funktionen auch als Kommando aufgerufen werden. Dies ist aber nur sinnvoll für Zeichenketten: >> dual A ans = 1 0 >> dual(’A’) ans = 1 0 >> dual(65) ans = 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 89 / 126 Inhaltsverzeichnis Einführung Grundlagen Programmierung Programmierung Funktionen Datei-Ausgabe Für Fortgeschrittene 90 / 126 Formatierte Ausgabe Wichtig für Benutzerinteraktion Strings zwischen ’ ’ Markieren von Variablen durch %-Zeichen Befehle: I %s - String ausgeben I %c - Character ausgeben I %d - Integer ausgeben I %f - Floating-point Zahl ausgeben (%.3f drei Dezimalstellen) I \n - Zeilenumbruch I \t - Tab I \\ - \ I %% - % 91 / 126 Beispiel >> fprintf(’Hallo Welt!\n’); Hallo Welt! >> >> Name = ’David’; >> Nummer = 3; >> fprintf(’%s ist der %d. Lotto-Gewinner dieses Jahr.\n’,Name,Nummer); David ist der 3. Lotto-Gewinner dieses Jahr. >> 92 / 126 Speichern in eine Datei >> >> >> >> Datei = fopen(’Winkel.txt’,’w’); fprintf(Datei,’Winkelumrechnung\n’); fprintf(Datei,’%d Grad sind %.2f Rad.\n’,30,30*pi/180); fclose(Datei); In der Datei Winkel.txt steht nun: Winkelumrechnung 30 Grad sind 0.52 Rad. 93 / 126 Inhaltsverzeichnis Einführung Grundlagen Programmierung Für Fortgeschrittene Aktuelles Verzeichnis und der Suchpfad Best practices Mehrdimensionale Felder (Tensoren) Cell Arrays Funktions-Handles und λ-Ausdrücke Zahlen und Strukturen Weiterführende Themen 94 / 126 Aktuelles Verzeichnis Eine MATLAB Sitzung befindet sich zu jedem Zeitpunkt in einem bestimmten Verzeichnis, welches mit pwd (für print working directory) angezeigt werden kann: >> pwd ans = /home/thomapp/Documents/MATLAB Dieses kann gewechselt werden im Fenster Current Folder oder mit dem Befehl cd (für change directory) >> cd Beispiele >> pwd ans = /home/thomapp/Documents/MATLAB/Beispiele >> cd .. >> pwd ans = /home/thomapp/Documents/MATLAB Mit .. wird das übergeordnete Verzeichnis bezeichnet. 95 / 126 Suchpfad Funktionen und Skripte sind Dateien und müssen also im Dateisystem gefunden werden. Zuerst sucht MATLAB im aktuellen Verzeichnis. Wenn es sich dort nicht findet in allen Verzeichnissen des Suchpfads (search path): >> path MATLABPATH /home/thomapp/Documents/MATLAB /opt/matlab/toolbox/matlab/datafun /opt/matlab/toolbox/matlab/datatypes /opt/matlab/toolbox/matlab/elfun /opt/matlab/toolbox/matlab/elmat [...] >> which signum /home/thomapp/Documents/MATLAB/Beispiele/signum.m >> which sound /opt/matlab/toolbox/matlab/audiovideo/sound.m Mit which wird einem angezeigt, wo die Funktion gefunden wurde. Mit addpath können für die aktuelle Sitzung weitere Verzeichnisse hinzugefügt werden. Für permanente Änderungen helfen die Einstellungen oder es muss die Datei pathdef.m geändert werden. 96 / 126 Inhaltsverzeichnis Einführung Grundlagen Programmierung Für Fortgeschrittene Aktuelles Verzeichnis und der Suchpfad Best practices Mehrdimensionale Felder (Tensoren) Cell Arrays Funktions-Handles und λ-Ausdrücke Zahlen und Strukturen Weiterführende Themen 97 / 126 Best practices I I I I I I I I I I I I clear am Anfang jedes Skripts Schreibe viele Kommentare / Dokumentation / README Modularisieren / Refactoring Parameter besser als globale Variablen / Funktionen besser als Skripte Prüfe die Eingaben von Funktionen Wellenlinien im Editor beachten Manchmal müssen in MATLAB Ausdrücke in Variablen gespeichert werden um sie zu verwenden try ... catch ... end Lerne Umgang mit Datenstrukturen und nutze diese dann! i,j: wenn als Variablennamen verwendet, dann komplexe Zahlen mit 1i,1j Recherchieren, ob Funktion bereits vorhanden (auch FileExchange). Am Ende eines langen Skripts: load(’handel’); sound(y,Fs); In den nächsten Paar Folien: I %% – Code Sections I Debugging I Alloziieren von Datenstrukturen Siehe auch: https://www.quora.com/What-are-your-best-MATLAB-programming-practices https://www.kellogg.northwestern.edu/rc/docs/gmpp.pdf http://springerlab.org/qmbc/files/MATLAB_Good_Programming_Practices.pdf 98 / 126 %% – Code sections Ein MATLAB-script kann strukturiert werden mittels Code Sections: %% Initialisierung der Variablen N = 1e6; P = rand(2,N); %% Auswertung n = sum(P(1,:).^2 + P(2,:).^2 < 1); pi = 4*n/N Im MATLAB-Editor werden diese schön hervorgehoben und Code Sections können einzeln ausgeführt werden. 99 / 126 Debugging Was macht man wenn ein Programm einen unerwarteten Fehler ausgibt, oder falsche Ergebnisse? 1. Man kann z.B. ein oder mehrere disp(x) in den Code einstreuen um zu beobachten, ob x den erwarteten Wert erhält. 2. Klickt man im Editor bei den Zeilennummern auf einen der Bindestriche, verwandelt er sich in ein rotes Stopzeichen, und man erhält an dieser Stelle einen Breakpoint. In der Folge wird das Skript bei jedem Aufruf an eben dieser Stelle unterbrochen. Dann kann man einzelne Werte betrachten, einzelne Zeilen im Skript abarbeiten lassen, etc. Der Breakpoint wird einfach durch anklicken wieder ausgeschaltet. Hinweis: Mit Rechts-Klick auf ein Stopzeichen kann man diesen bedingt scharf werden lassen. . . 100 / 126 Alloziieren von Datenstrukturen Das folgende Programm braucht 0.7 Sekunden: clear N = 1e3; tic for i=1:N A(i,:) = i+[1:N]; end toc Das folgende (längere) Programm dagegen braucht nur 0.03 Sekunden! clear N = 1e3; tic A = zeros(N); for i=1:N A(i,:) = i+[1:N]; end toc Der Grund ist, dass im ersten Fall A jedesmal vergrössert werden muss, und zwar um Zeilen. Da MATLAB Matrizen Spaltenweise speichert muss also jedesmal die bestehende Matrix in eine neue Form kopiert werden. 101 / 126 Inhaltsverzeichnis Einführung Grundlagen Programmierung Für Fortgeschrittene Aktuelles Verzeichnis und der Suchpfad Best practices Mehrdimensionale Felder (Tensoren) Cell Arrays Funktions-Handles und λ-Ausdrücke Zahlen und Strukturen Weiterführende Themen 102 / 126 Mehrdimensionale Felder Erweiterung des Matrizenbegriffes auf beliebige Achsen, in MATLAB Dimensionen genannt Definition eines 2 × 4 × 3-Feldes >> A(:,:)=[111 121 131 141; 211 221 231 241]; >> A(:,:,2)=A(:,:,1)+1; >> A(:,:,3)=A(:,:,1)+2; >> A A(:,:,1) = 111 121 131 141 211 221 231 241 A(:,:,2) = 112 122 132 142 212 222 232 242 A(:,:,3) = 113 123 133 143 213 223 233 243 >> size(A), ndims(A) ans = 2 4 3 ans = 3 103 / 126 Mehrdimensionale Felder Summation über eine angegebene Dimension: >> sum(A,3) ans = 336 366 636 666 396 696 426 726 Das Ergebnis entspricht dem von A(:,:,1)+A(:,:,2)+A(:,:,3) Elementare Funktionen elementeweise: sin(A); Mit rand(4,2,7,5) wird eine 4 × 2 × 7 × 5-Zufallsmatrix generiert Weiterhin Funktionen randn, ones, zeros squeeze(A) enfernt alle Dimensionen der Länge 1 104 / 126 Beispiel: Bilder Ein Farbbild hat drei Farbkanäle pro Pixel, also ist es ein h × b × 3 Tensor: >> peppers = imread(’peppers.png’); >> size(peppers) ans = 384 512 3 >> subplot(2,2,1) >> image(peppers); >> subplot(2,2,2) >> image(peppers(:,:,1)); title(’Rot’) >> subplot(2,2,3) >> image(peppers(:,:,2)); title(’Grün’) >> subplot(2,2,4) >> image(peppers(:,:,3)); title(’Blau’) Dies ist also ein 384 × 512-Bild mit drei Farbkanälen. HD-Farbfilme sind dann 1080 × 1920 × 3 × t Tensoren. 105 / 126 Multilinearformen und Tensoren Eine Matrix kann (nach Wahl von Basen) eine lineare Abbildung V → W darstellen. Sie kann aber auch eine sog. Bilinearform darstellen. Generell spricht man von k -Linearformen. Definition Seien V1 , . . . , Vk Vektorräume. Eine Abbildung φ : V1 × · · · × Vk → K heisst k -Linearform wenn für alle (v1 , . . . , vk ) ∈ V1 × · · · × Vk , für alle 1 ≤ i ≤ k , alle w ∈ Vi und alle α, β ∈ K gilt: φ(v1 , . . . , vi−1 , αvi + βw, vi+1 , . . . , vk ) = α φ(v1 , . . . , vi−1 , vi , vi+1 , . . . , vk ) + β φ(v1 , . . . , vi−1 , w, vi+1 , . . . , vk ) Man spricht manchmal auch von einem (kovarianten) Tensor k -ter Stufe. Zur Übersicht über die Begriffe: MATLAB ndim(A) size(A,i) Dimensionen Size Mathematik k ni Stufen / Achsen Dimensionen 106 / 126 Multilinearformen und Tensoren Wir nehmen jetzt an, dass alle beteiligten Vektorräume endlich-dimensional sind mit dim(Vi ) = ni für all i ≤ k und wählen jeweils eine Basis (eji )j≤di , i ≤ k. Dann ist einfach zu sehen, dass jede k -Form φ genau einem n1 × · · · × nk -Tensor A entspricht, nämlich: A(i1 , . . . , ik ) = φ(ei1 , . . . , eik ). 1 k Der Spezialfall k = 2 wird Bilinearform genannt. genau P Jeder Bilinearform φ entspricht P eine n1 × n2 -Matrix A, so dass für alle v = α e ∈ V1 und alle w = β e0 ∈ V2 i i i j j j gilt: φ(v , w) = φ d1 X i=1 αi ei , d2 X j=1 ! βj ej0 = d1 d2 X X i=1 j=1 d2 d1 X X αi βj φ ei , ej0 = i=1 αi βj Aij j=1 = v T A w. 107 / 126 Inhaltsverzeichnis Einführung Grundlagen Programmierung Für Fortgeschrittene Aktuelles Verzeichnis und der Suchpfad Best practices Mehrdimensionale Felder (Tensoren) Cell Arrays Funktions-Handles und λ-Ausdrücke Zahlen und Strukturen Weiterführende Themen 108 / 126 Cell Arrays Vektoren, Matrizen, mehrdimensionale Felder müssen immer Einträge des selben Typs angeordnet in einer Gitterstruktur haben. Cell Arrays sind Verallgemeinerungen, bei denen jede Zelle irgendetwas eigenes enthalten kann! Definition mit {} statt [] >> A = { ’Hallo’, ’Welt’, pi, [3:4] } A = ’Hallo’ ’Welt’ [3.1416] [1x2 double] >> A{2} ans = Welt >> A{4} ans = 3 4 >> B = {1, ’Fermat’, rand(3); [1,2; 3, 4], ones(100), ’Bier’} B = [ 1] ’Fermat’ [3x3 double] [2x2 double] [100x100 double] ’Bier’ >> B{1,3} ans = 0.8147 0.6324 0.9575 0.9058 0.0975 0.4854 0.1270 0.2785 0.8003 >> B{2,3} ans = Bier 109 / 126 Strings Elementare Zeichenketten sind Zeilenvektoren von Zeichen (jeweils 16bit Unicode). Bei einer Ansammlung von Strings, sind diese meistens von verschiedenen Längen, und passen nicht in char-Arrays: >> [ ’Leibniz’ , ’Gauss’ , ’Hilbert’ ] ans = LeibnizGaussHilbert >> size(ans) ans = 1 19 >> [ ’Leibniz’ ; ’Gauss’ ; ’Hilbert’ ] Dimensions of matrices being concatenated are not consistent. Deshalb werden dazu in MATLAB Cell Arrays verwendet: >> { ’Leibniz’ , ’Gauss’ , ’Hilbert’ } ans = ’Leibniz’ ’Gauss’ ’Hilbert’ >> size(ans) ans = 1 3 >> { ’Leibniz’ ; ’Gauss’ ; ’Hilbert’ } ans = ’Leibniz’ ’Gauss’ ’Hilbert’ 110 / 126 Teile des Cell Arrays können wie gehabt mit (...) betrachtet werden: >> A(1:2) ans = ’Hallo’ ’Welt’ >> A(2:end) ans = ’Welt’ [3.1416] >> B(2,2:3) ans = [100x100 double] [1x2 double] ’Bier’ Dies sind natürlich wieder Cell Arrays! Achtung: Bei Indizierung mit () kommt immer ein Cell Array heraus, auch wenn es ein 1 × 1-Cell Array ist: >> A{4} ans = 3 4 >> A(4) ans = [1x2 double] >> class(A{4}) ans = double >> class(A(4)) ans = cell 111 / 126 Komma-separierte Listen Was ist jetzt A{3:4} – eine sog. Komma-separierte Liste: >> A{3:4} ans = 3.1416 ans = 3 4 Dies ist dasselbe wie: >> A{3} , A{4} ans = 3.1416 ans = 3 4 >> pi , [3,4] ans = 3.1416 ans = 3 4 112 / 126 Tricks mit Komma-separierten Listen Die Argumente einer Funktion sind ja eine Komma-separierte Liste, also können hier Komma-separierte Listen eingesetzt werden: >> linspace(1,2,3) ans = 1.0000 1.5000 >> C = {1,2,3} C = [1] [2] [3] >> linspace(C{:}) ans = 1.0000 1.5000 >> linspace(C{1:2},3) ans = 1.0000 1.5000 2.0000 2.0000 2.0000 Mit {:} können die Einträge direkt in Variablen gespeichert werden: >> [e,f,g] = C{:} e = 1 f = 2 g = 3 113 / 126 Konvertieren zwischen Matrizen und Cell Arrays >> cell2mat(C) ans = 1 2 3 >> [C{:}] ans = 1 2 3 >> num2cell(1:3) ans = [1] [2] [3] Einiges spannender aber komplizierter ist mat2cell: >> A = rand(5); >> mat2cell(A, [2 3] , [1,2,1,1]) ans = [2x1 double] [2x2 double] [3x1 double] [3x2 double] [2x1 double] [3x1 double] [2x1 double] [3x1 double] Die 5 × 5-Matrix wird gitterartig in einen Cell Array zerlegt: I Für die Zeilen werde aus [2 3] zwei Zell-Zeilen, wobei die erste jeweils 2 ursprüngliche Matrix-Zeilen und die zweite 3 Matrix-Zeilen übernimmt. I Für die Spalten werden aus [1 2 1 1 1] vier Zell-Spalten, wobei die erste jeweils 1 ursprüngliche Matrix-Spalte, die zweite 2 Matrix-Spalten, . . . übernimmt. 114 / 126 Inhaltsverzeichnis Einführung Grundlagen Programmierung Für Fortgeschrittene Aktuelles Verzeichnis und der Suchpfad Best practices Mehrdimensionale Felder (Tensoren) Cell Arrays Funktions-Handles und λ-Ausdrücke Zahlen und Strukturen Weiterführende Themen 115 / 126 Nullstellenbestimmung Wir wollen numerisch eine Nullstelle der sin-Funktion berechnen lassen. I fzero(fct,x0) berechnet eine Nullstelle der Funktion fct in der Nähe von x0 I fzero(fct,[a b]) berechnet eine Nullstelle der Funktion fct im Intervall [a, b], falls fct(a)*fct(b) < 0 (Vorzeichenwechsel) Als Argument müssen wir einen Parameter fct übergeben. Also müssen wir auf die sin verweisen. Dies geht mit dem @-Symbol: >> fun = @sin; >> fzero(fun,2) ans = 3.1416 >> fzero(fun,[3,4]) ans = 3.1416 Man kann auch direkt schreiben >> fzero(@sin,2) ans = 3.1416 >> fzero(@sin,[3,4]) ans = 3.1416 116 / 126 λ-Ausdrücke Möchte man nun die Gleichung: sin(x) = 1 2 lösen, muss man eine neue Funktion erstellen: g(x) := sin(x) − 12 . Man braucht also die Funktionen nur, um sie gleich wieder zu vergessen. Das wird in der Informatik ein λ-Ausdruck genannt. In MATLAB geht das auch mit dem @-Zeichen: >> g = @(x) sin(x) - 0.5 g = @(x)sin(x)-0.5 >> fzero(g, 2) ans = 2.6180 >> fzero(@(x) sin(x)-0.5, 2) ans = 2.6180 Dies geht übrigens auch mit mehreren Argumenten: @(x,y,z) sin(x)/y + z 117 / 126 Minimierung, Numerische Integration Minimalstelle der Funktion fun zwischen 0 und 20: >> fun = @sin fun = @sin >> fminbnd(fun,0,20) ans = 10.9956 >> [stelle, wert] = fminbnd(fun,0,20) stelle = 10.9956 wert = -1.0000 Integral der Funktion fun von 0 bis 1 >> quad(fun,0,1) ans = 0.4597 118 / 126 Easy Plotten von Funktionen: ezplot Einfache Funktionsplots mussten wir bislang wie folgt zeichnen: t = linspace(0,1); plot(t, sin(t)) t = linspace(-3*pi, 3*pi); plot(t, sin(t)) t = linspace(0,600); plot(t, f(t)+1) Die Funktion ezplot nimmt einem etwas dieser Arbeit ab. Sie plottet, wenn nichts anderes angegeben wird, auf dem Intervall [−2π, 2π]. ezplot(@sin) ezplot(@sin,[0,4*pi]) ezplot(@(t) f(t)+1, [0,600]) ezplot meckert, wenn sich die übergebene Funktion nicht gut auf Vektoren versteht: >> ezplot(@(x) x^2) Warning: Function failed to evaluate on array inputs; vectorizing the function may speed up its evaluation and avoid the need to loop over array elements. Deshalb sollte man die punktweisen Operationen verwenden (und muss dies in Octave sogar zwingend): >> ezplot(@(x) x.^2) 119 / 126 Inhaltsverzeichnis Einführung Grundlagen Programmierung Für Fortgeschrittene Aktuelles Verzeichnis und der Suchpfad Best practices Mehrdimensionale Felder (Tensoren) Cell Arrays Funktions-Handles und λ-Ausdrücke Zahlen und Strukturen Weiterführende Themen 120 / 126 Zahlen MATLAB unterscheidet zwischen Gleit-Komma, Ganzzahl und natürlichen Zahlen: 64bit 32bit 16bit 8bit Gleit-Komma float Ganzzahl signed integer Natürlich unsigned integer double (11bit exponent, 52bit mantisse) single (8bit exponent, 23bit mantisse) @ @ int64 int32 int16 int8 uint64 uint32 uint16 uint8 Dabei ist double der default! Wenn mit sehr viel Daten hantiert werden muss, kann es sich lohnen, sparsamere Datentypen zu verwenden, falls diese ausreichen: >> a=[1:100]; b=single(1:100); c=uint8(1:100); d=int8(1:100); >> whos Name Size Bytes Class Attributes a b c d 1x100 1x100 1x100 1x100 800 400 100 100 double single uint8 int8 121 / 126 Strukturen Zusammenfassung mehrerer Teilvariablen zu einer Sammelvariablen in tabellarischer Form >> Staedte = struct(’Name’,’Stuttgart’,... ’BevoelkFlaeche’,[597939,207.36],... ’Buergermeister’,’Fritz Kuhn’,’Vorwahl’,’0711’) Staedte = Name : ’Stuttgart’ BevoelkFlaeche: [597939,207.36] Buergermeister: ’Fritz Kuhn’ Vorwahl: ’0711’ >> Staedte(3) = struct(’Name’,’Berlin’,... ’BevoelkFlaeche’,[3517424,891.85],... ’Buergermeister’,’Michael Müller’,’Vorwahl’,’030’) Staedte = 1x3 struct array with fields: Name : BevoelkFlaeche: Buergermeister: Vorwahl: 122 / 126 Strukturen >> Staedte(2) ans = Name : [] BevoelkFlaeche: [] Buergermeister: [] Vorwahl: [] >> Staedte(2).Name = ’Hamburg’; >> Staedte(2).BevoelkFlaeche = [1746342,755.22]; >> Staedte(2).Buergermeister = ’Olaf Scholz’; >> Staedte(2).Vorwahl = ’040’; >> Staedte.Name ans = Stuttgart ans = Berlin ans = Hamburg >> {Staedte.Name} ans = ’Stuttgart’ ’Berlin’ ’Hamburg’ 123 / 126 Strukturen >> Staedte(1).Kfz = ’S’; >> Staedte(2).Kfz = ’B’; >> Staedte(3).Kfz = ’HH’; >> rmfield(Staedte,’Buergermeister’); >> Staedte Staedte = 1x3 struct array with fields: Name : BevoelkFlaeche: Vorwahl: Kfz: >> Staedte = orderfields(Staedte); >> Staedte(1) ans = BevoelkFlaeche: [597939,207.36] Kfz: ’S’ Name : ’Stuttgart’ Vorwahl: ’0711’ 124 / 126 Inhaltsverzeichnis Einführung Grundlagen Programmierung Für Fortgeschrittene Aktuelles Verzeichnis und der Suchpfad Best practices Mehrdimensionale Felder (Tensoren) Cell Arrays Funktions-Handles und λ-Ausdrücke Zahlen und Strukturen Weiterführende Themen 125 / 126 Weiterführende Themen I mexFunction: C/C++ Routinen als MATLAB-Funktionen I variable Argumente, variable Rückgabe I Objektorientierung I try ... catch ... end I profile on ; ... profile off ; profile viewer I Toolboxen: benutzen, selber schreiben I Simulink I FileExchange I ... 126 / 126