Folien - Institut für Stochastik und Anwendungen

Werbung
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
Herunterladen