Einführung in Matlab
Matlab ist ein (kommerzielles, teures) Programmpaket, das es auf einfache Weise erlaubt, nummerische Rechnungen interaktiv durchzuführen und Daten grafisch darzustellen. Der Umgang mit Vektoren und Matrizen wird in natürlicher Weise unterstützt, ebenso das Rechnen mit komplexen Größen. Umfangreichere Programme können als Matlab-Skripte abgelegt werden. Viele effiziente Funktionen sind eingebaut und erlauben auch die Ausführung anspruchsvoller Rechnungen.
Frei verfügbare Programme mit ähnlicher Zielrichtung sind GNU Octave und Scilab.
Aufruf, Hilfe
Matlab wird aufgerufen
- aus dem Menü der grafischen Oberfläche;
-
im Terminal-Fenster am Unix-Prompt:
unix> matlab
In der Regel öffnet sich eine neue Oberfläche zur Bedienung von Matlab. Sie enthält ein Kommando-Fenster mit Matlab-Prompt >> und einen Zugang zur Online-Hilfe.
Eine schnelle Auskunft zu einem bekannten Befehl erhält man auch so:
>> help sqrt
Matlab wird beendet durch
- Schließen der grafischen Oberfläche oder
- >> quit am Matlab-Prompt.
Konstanten, Arithmetik
Matlab rechnet durchweg mit Gleitkomma-Zahlen (64 Bit, also auf etwa 16 Dezimalstellen genau), eine Sonderbehandlung für ganze Zahlen gibt es nicht. Das Dezimalkomma ist immer ein Punkt! Auch die Eingabe von Zehnerpotenzen und komplexen Zahlen ist möglich.
Beispiele: 3.5 -5 2.6e9 -3E-5 2.5 + 3.4i
Mit Hilfe der Rechenzeichen
+ - * / ^ ( )
kann man einfache Rechenaufgaben am Matlab-Prompt eingeben, die Antwort wird unmittelbar angezeigt. Zunächst erscheinen nur ca. 5 Dezimalstellen, wer es genauer wissen will, kann umstellen mit
format long
Variablen
Variablen sind benannte Speicherplätze für Werte, ihre Namen werden aus Buchstaben (groß/klein!), Ziffern und "_" zusammengesetzt (beginnend mit einem Buchstaben). Bei der Wertzuweisung wird automatisch geeigneter Speicherplatz (für reelle oder komplexe Zahlen) reserviert, z.B.
r = (3^2 + 2*5.5)^4 | reele Arithmetik |
z = (5 + 2i)/(3 + 4i) | komplexe Arithmetik |
u = z/r | komplexe Arithmetik |
Das Ergebnis wird sofort angezeigt, wenn das stört, sollte man die die Zuweisung mit ";" abschließen.
pi und i sind vordefiniert und liefern das Erwartete, solange man sie nicht anderweitig belegt.
Matrizen
In Matlab werden numerische Größen durchweg als Matrizen angesehen, also als rechteckige Anordnungen von (reellen oder komplexen) Zahlen, die in Zeilen und Spalten organisiert sind. Einzelwerte (Skalare), Zeilen- und Spaltenvektoren sind Spezialfälle davon.
Beispiele für direkte Eingabe:
zeile = [1 2 3] | Zeilenvektor mit 3 Werten |
spalte = [4; 5; 6; 7] | Spaltenvektor mit 4 Werten |
matrix = [1 2 3; 4 5 6] | (2x3)-Matrix |
x = [0:.1:10] |
Zeilenvektor mit 101 Werten [0 .1 .2 .. 9.9 10] |
Einige spezielle (mxn)-Matrizen:
zeros(m,n) | Nullmatrix |
ones(m,n) | Matrix aus Einsen |
eye(m,n) | Einheitsmatrix |
rand(m,n) | Zufallszahlen aus [0,1] |
Die Auslegung der Matrizen wird nicht explizit vereinbart, sondern richtet sich automatisch nach der Wertzuweisung. Auch komplexe Größen entstehen "von selbst".
Die aktuellen Eigenschaften aller belegten Variablen zeigt der Befehl
whos
Gelegentlich möchte man Objekte löschen, dazu dient clear:
clear x | löscht x |
clear | löscht alle Variablen |
clear all | löscht/initialisiert alles (Variablen, Funktionen, ...) |
Arithmetische Operationen zwischen Matrizen versucht Matlab, im Sinne der Matrizenrechnung auszuführen. Das gilt z.B. für Potenzen wie A^2 (die so nur mit quadratischen Matrizen funktionieren) und sogar für die Division, die als Matrixinversion interpretiert wird: A/B gibt A*B^(-1), A\B bedeutet A^(-1)*B !
Einfache Verknüpfungen mit einem Skalar s werden elementweise ausgeführt: s*A, A/s, A+s, A-s.
Ansonsten muss man elementweise Ausführung oft ausdrücklich verlangen, dazu dienen die Rechenzeichen
.* ./ .^
z.B. quadriert [1:10].^2 die Zahlen von 1 bis 10.
Einige nützliche Operationen mit Matrizen und Vektoren:
A.' | transponierte Matrix, z.B. Zeile <-> Spalte |
A' | Hermitesch konjugierte Matrix |
size(A) | Größe von A |
size(A,1) | Zeilenzahl von A |
size(A,2) | Spaltenzahl von A |
length(v) | Länge eines Vektors |
sum(v) | Summe über Vektorelemente |
prod(v) | Produkt über Vektorelemente |
max(v) | Maximalwert |
Zugriff auf einzelne Elemente eines Vektors oder einer Matrix erhält man durch Angabe von Indizes (beginnend mit 1), z.B. x(3) oder matrix(3,5) . Um einen Teilvektor zu spezifizieren, gibt man einen Indexbereich an wie in x(2:4) . Ein blanker `:' (Doppelpunkt) bezeichnet den gesamten Indexbereich - damit ist also matrix(2,:) die zweite Zeile der Matrix, und matrix(:,2:4) ist eine kleinere Matrix, bestehend aus den Spalten 2-4 von matrix.
Text
Gelegentlich braucht man auch Größen, die Text enthalten (Zeichenketten, "strings"), z.B. für Dateinamen oder zum Beschriften von Grafiken. Der Text wird in Apostrophs eingeschlossen und kann auch Variablen zugewiesen werden, etwa
titel = 'Meine erste Matlab-Grafik'
Eingebaute Funktionen
Viele elementare Funktionen sind in Matlab unmittelbar verfügbar, z.B.
sqrt exp log log2 log10 sin cos tan cot asin acos atan acot
Je nach Bedarf rechnen sie reell oder komplex. Auf eine Matrix angewandt, wirken sie elementweise. Die trigonometrischen Funktionen arbeiten durchweg im Bogenmaß.
Beispiele:
log(2) | |
sqrt([1:10]) | Wurzeln aus den Zahlen 1 bis 10 |
cos(pi) | gibt (-1) |
Grafiken
Die folgenden Befehle stellen eine Wertetabelle für y = x^2 im Bereich x = 0..4 her und erzeugen damit eine Grafik:
x = [0:.1:4]; y = x.^2; plot(x,y)
Der Befehl plot erwartet (im einfachsten Falle) zwei gleich lange Zeilenvektoren als Argumente und trägt sie gegeneinander auf. Die Punkte werden zu einem Polygonzug verbunden. Über ein drittes Argument (Zeichenkette) kann man den Linientyp angeben: - -- : -. . Die Angabe eines Punktsymbols, z.B. o + x * , unterdrückt den Linienzug. Ausserdem kann noch die Farbe spezifiziert werden als r g b etc.
Beispiele:
plot(x,y,'r:') rote, punktierte Linie plot(x,y,'bo') blaue Kreissymbole
Um Datenpunkte mit Fehlerbalken (in y-Richtung) zu plotten, setzt man die Fehler in einen dritten Vektor dy und ruft z.B. auf:
errorbar(x,y,dy,'o')
Eine Funktion zweier Variablen z = f(x,y) stellt man so dar: zunächst bildet man zwei Vektoren x und y, die ein Gitternetz von Stützpunkten in der Ebene definieren, und setzt die zugehörigen Funktionswerte in eine Matrix Z passender Größe: Z(i,j) = f(x(j),y(i)) (sic!). Damit plottet man
contour(x,y,Z) ebener Kontour-Plot (Hoehenlinien) mesh(x,y,Z) 3D-Plot mit farbigem Gitternetz surf(x,y,Z) 3D-Plot mit farbiger Flaeche
Der Aufruf einer Plotfunktion löscht i.a. die letzte Grafik. Um etwas hinzuzufügen, hält man sie mit hold on fest, mit hold off hebt man diesen Zustand wieder auf.
Matlab-Programmierung
Beispiele für Kontrollstrukturen:
s = 0; for k = 1:10 s = s + k; % summiert die Zahlen von 1 bis 10 end z = 1; n = 0; while z > 0 % sucht die kleinste darstellbare positive Zahl... z = z/2; n = n + 1; end disp(2^(-n+1)) % ...und gibt sie aus. for j = 0:100 if j == 50 break % bricht bei j=50 ab end end
Vergleichsoperatoren:
== ~= < <= > >=
siehe help relop
Text hinter "%" ist ein Kommentar und wird von Matlab ignoriert.
Statt aus dem Kommando-Fenster kann man ein Matlab-Programm auch aus einer Datei aufrufen. Ein solches Skript muss die Endung ".m" haben. Wenn man z.B. eines der obigen Beispiele mit einem Texteditor in die Datei testprogramm.m schreibt (und abspeichert!), ist es zu starten mit
testprogramm
Es läuft dann so ab, als ob man es direkt eingetippt hätte. (Ggf. muss man noch in Matlab mit cd ins richtige Verzeichnis wechseln - mit pwd wird das aktuelle Verzeichnis angezeigt.)
Eigene Funktionen
Beispiel für die Definition einer eigenen Funktion "radius":
function [r] = radius(x,y) % berechnet r = sqrt(x^2 + y^2) % funktioniert auch mit (gleich grossen!) Vektoren/Matrizen x,y r = sqrt(x.^2 + y.^2);
Dies schreibt man in eine Datei radius.m.
Der Aufruf lautet dann
radius(x,y);
Ein- und Ausgabe
z = input('Frage'); % fragt nach Eingabe und speichert sie unter "z" disp(x) % gibt Matrix oder Text aus sprintf('format', x, ..); % schreibt Text und Daten formatiert
Dateien lesen und schreiben
save -ascii a.dat m % schreibt Matrix m in Datei a.dat (einfach genau) save -ascii -double a.dat m % schreibt Matrix m in Datei a.dat (doppelt genau) load -ascii a.dat % belegt Matrix a mit Daten aus a.dat m = load('-ascii', 'a.dat') % belegt Matrix m mit Daten aus a.dat fid = fopen('datei', 'w'); % oeffnet Datei und definiert fid (file identifier) fprintf(fid, 'format', x, ..) % schreibt formatiert in Datei fscanf(fid, 'format', x, ..) % liest formatierte Daten aus Datei fclose(fid); % schliesst Datei
Bei Zugriffen auf Dateien kann man mit absoluten Pfadnamen arbeiten, bequemer sind aber relative Angaben, bezogen auf das aktuelle Arbeitsverzeichnis. Das wiederum kann man anzeigen, wechseln etc, indem man (am Matlab-Prompt) die üblichen Unix-Befehle (pwd, cd, ls ...) verwendet.
B. Bunk, 24.02.2014