Inhaltsverzeichnis
- Matlab
- Was ist Matlab?
- Wie schreibe ich eine eigene Funktion?
- Warum gibt mein Skript so viele Daten aus?
- Wie schreibt man beliebige Daten in eine Textdatei?
- Wie schreibt man Binärdaten in eine Datei?
- Wie entferne ich Elemente aus einem Vektor?
- Wie füge ich Elemente in ein Array ein?
- Wie wandelt man ein Array in einen Vektor um?
- Wie erstellt man n gleichverteilte Punkte in einem bestimmten Intervall?
- Wie berechnet man die Laufzeit einer Funktion?
- Wie berechnet man in einem Array das Minimum, Maximum, ...?
- Wie berechnet man lokale Extremwerte eines Vektors?
- Wie verändere ich die Darstellung meiner Ausgaben?
- GUIDE
- Was ist ein Handle?
Matlab ist ein kommerzielles Software-Paket von
The MathWorks.
Es stellt eine komplette Umgebung zur Hochsprachen-Programmierung und zur interaktiven Datenanalyse zur
Verfügung. Matlab zeichnet sich durch numerische Berechnungen aus, besonders mit Vektoren und Matrizen.
Symbolische Mathematik ist über eine Toolbox verfügbar, die mit einem Maple-Kernel arbeitet.
Der Name Matlab ist zusammengesetzt aus "
Matrix
laboratory".
Matlab kennt verschiedene Funktionsarten.
- Anonyme Funktionen
Anonyme Funktionen sind ein schnelles Hilfsmittel um einfache Funktionen zu erstellen, ohne dabei ein
eigenes M-File zu erstellen. Sie können in der Matlab-Kommandozeile, in M-Files und in Skripten definiert
werden.
Syntax:
FktHandle = @(Argumente) Ausdruck
Beispiel:
sum = @(x, y) x + y % Definieren der anonymen Funktion sum
sum(3, 7) % Aufruf der Funktion sum, liefert 10
- Inline-Funktionen
Das Schlüsselwort inline erzeugt eine Inline-Funktion. Die Argumente einer Inline-Funktion werden
automatisch anhand von Zeichenketten innerhalb des Funktionsausdrucks ermittelt.
Syntax:
inl = inline('Ausdruck')
Beispiel:
sum = inline('x + y') % Definieren der Inline-Funktion sum
sum(4, 6) % Aufruf der Funktion sum
- Matlab-Funktionen
Matlab-Funktionen werden in sogenannten M-Files abgelegt. Sie dienen zum Erweitern der Matlab-Sprache um
eigene Funktionalität. Eine Matlab-Funktion sollte denselben Namen wie das M-File tragen, im dem
sie steht.
Aufbau:
function retval = funname(params) % Funktions-Definition
function % Schlüsselwort zum Einleiten
% der Funktions-Definition
retval % Rückgabewert(e) der Funktion
funname % Funktionsname (sollte dem
% Dateinamen entsprechen)
params % Übergabeparameter
Beispiel:
function summe = sum(x, y)
% Funktion zur Berechnung der Summe zweier Zahlen
%
% Dieser Kommentar erscheint beim Ausführen von
% 'help sum' in der Matlab-Kommandozeile.
summe = x + y; % Funktionsrumpf
In Matlab werden einzelne Befehle durch den Beginn einer neuen Zeile getrennt. Dabei wird stets das Ergebnis
eines Befehls zurückgegeben. Um zu verhindern, dass dieses Ergebnis auf der Matlab-Kommandozeile
ausgegeben wird, muss jedoch ein Semikolon am Ende des Befehls eingefügt werden.
Beispiel:
a = 3 % Ausgabe: 'a = 3', wegen fehlendem Semikolon
a = 3; % Keine Ausgabe
Um Daten in eine Textdatei zu schreiben, gibt es die verschiedensten Funktionen, wie csvwrite, dlmwrite
oder wk1write. Diese beschränken sich jedoch stets auf ein bestimmtes Dateiformat. Um die komplette Kontrolle
über die Dateiausgabe zu erhalten, gibt es den Befehl
fprintf. Damit lassen sich beliebige Daten formatiert
in eine Datei (oder auch auf die Matlab-Kommandozeile) ausgeben.
Bevor man mit
fprintf jedoch Daten schreiben kann, muss zuerst eine Datei von Hand geöffnet werden. Folgendes
Beispiel zeigt einen möglichen Ablauf:
fd = fopen('export.csv', 'w'); % Öffnen der Datei export.csv zum Schreiben
fprintf(fd, '%s,%d\n', 'String', 11); % Schreiben der Daten mittels fprintf
fclose(fd); % Schließen der Datei
Für eine detaillierte Beschreibung der Formatierungsmöglichkeiten, kann die Matlab-Hilfe herangezogen werden.
help fprintf
doc fprintf
Binärdaten können mit dem Befehl
fwrite in eine Datei geschrieben werden.
fwrite schreibt dabei ganze Arrays auf
einmal. Die Datei zum Schreiben muss wiederum von Hand geöffnet werden:
fd = fopen('export.bin', 'w'); % Öffnen der Datei export.bin zum Schreiben
fwrite(fd, 0:9, 'integer*2'); % Schreiben der Zahlen 0-9 als 2-Byte-Integer
fclose(fd); % Schließen der Datei
Das Auslesen der Daten geht dabei analog zum Schreiben:
fd = fopen('export.bin', 'r'); % Öffnen der Datei export.bin zum Lesen
arr = fread(fd, 'integer*2'); % Datei auslesen und Ergebnis in 'arr' speichern
fclose(fd); % Schließen der Datei
Eine Liste mit verfügbaren Datenformaten findet man in der Hilfe:
help fread
doc fread
Elemente können aus einem Vektor entfernt werden, indem ihnen der "Wert" [] zugewiesen wird. Das Ganze
sieht dann etwa so aus:
x = 0:9; % Erstellen eines Vektors mit 10 Elementen
x([2, 4, 7]) = [] % Entfernen des 2., 4. und 7. Elements
Wenn einzelne Elemente aus einem Array entfernt werden, wird dieses in einen Vektor umgewandelt (da dann
die Dimensionen natürlich nicht mehr passen). Es ist aber möglich ganze Zeilen und Spalten aus einem Array
zu entfernen. Dazu muss ihnen wiederum [] zugewiesen werden:
x = pascal(5); % Erstellen eines Pascal-Arrays der Dimension 5x5
x(1, :) = [] % Entfernen der ersten Zeile
x(:, [3, 5]) = [] % Entfernen der dritten und fünften Spalte
Diese häufig gestellte Frage lässt sich leider nicht pauschal beantworten. Es kommt immer darauf an, mit welchen
Daten dass gearbeitet wird. Deshalb hier ein paar kurze Beispiele:
Anfügen einzelner Elemente ans Vektorende.
a = 0:8; % Zeilenvektor
a(end + 1) = 9; % Möglichkeit 1
a = [a 9]; % Möglichkeit 2
a = cat(2, a, 9); % Möglichkeit 3
a = (0:8)'; % Spaltenvektor
a(end + 1) = 9; % Möglichkeit 1
a = [a; 9]; % Möglichkeit 2
a = cat(1, a, 9); % Möglichkeit 3
Anfügen mehrerer Elemente ans Vektorende.
a = 0:6; % Zeilenvektor
b = 7:9; % Anzufügender Vektor
a = [a b]; % Möglichkeit 1
a = cat(2, a, b); % Möglichkeit 2
a = (0:6)'; % Spaltenvektor
b = (7:9)'; % Anzufügender Vektor
a = [a; b]; % Möglichkeit 1
a = cat(1, a, b); % Möglichkeit 2
Anfügen von Zeilen an ein Array.
a = ones(5); % 5x5-Array
a(end + 1, :) = 5:9; % Möglichkeit 1
a = [a; 5:9]; % Möglichkeit 2
a = cat(1, a, 5:9); % Möglichkeit 3
Anfügen von Spalten an ein Array.
a = ones(5); % 5x5-Array
a(:, end + 1) = 5:9; % Möglichkeit 1
a = [a'; 5:9]'; % Möglichkeit 2
a = cat(2, a, (5:9)'); % Möglichkeit 3
Alle oben genannten Möglichkeiten können auch dazu verwendet werden, um Elemente am Anfang eines Arrays
einzufügen. Dazu muss lediglich die Reihenfolge von einzufügenden Elementen und dem Array vertauscht
werden. (Eine Ausnahme ist die Schreibweise mit end. Damit kann wirklich nur am Ende eingefügt werden.)
a = magic(10); % 10x10-Array
a = a(:); % Möglichkeit 1
a = reshape(a, prod(size(a)), 1); % Möglichkeit 2
n = 100000; % Eine Million Punkte
a = linspace(0, 1, n); % Möglichkeit 1
a = 0: 1 / (n - 1): 1; % Möglichkeit 2
Im Allgemeinen ist Möglichkeit 2 vorzuziehen, da sie um ein Vielfaches schneller arbeitet.
tic; linspace(0, 1, 1000000); toc;
Mit dem Befehl
tic wird die aktuelle Uhrzeit gespeichert. Mit
toc wird
dann die Differenz der aktuellen Uhrzeit zur zuvor gespeicherten Uhrzeit berechnet und ausgegeben. Die Dauer aller
dazwischen ausgeführten Befehle wird somit gemessen.
a = magic(10); % 10x10-Array
min(a(:)); % Minimum
max(a(:)); % Maximum
median(a(:)); % Mittelwert
std(a(:)); % Standard-Abweichung
var(a(:)); % Streuung
prod(a(:)); % Produkt
sum(a(:)); % Summe
Eine Erklärung der einzelnen Funktionen ist in der dazugehörenden Hilfe zu finden.
Lokale Extremwerte lassen sich recht einfach mit folgenden Befehlen finden:
a = [0 -1 1 3 2 1 2 0 -2 0]; % Vektor definieren
d = sign(diff(a)); % Differenz zum Vorgängerelement bestimmen
find(d ~= [d(1) d(1: end - 1)]) % Indizes der lokalen Extremwerte berechnen
Um lokale Maxima zu erkennen kann statt des ~= ein <, für die Minima ein > verwendet werden.
Matlab bietet die Möglichkeit die Darstellung der ausgegebenen Zahlen anzupassen. Dafür gibt es den Befehl
format. Dieser kennt folgende wichtigen Parameter:
format compact % Unterdrückung unnötiger Zeilenumbrüche
format hex % Zahlenwerte hexadezimal ausgeben
format rat % Zahlenwerte als Brüche ausgeben
format short % Zahlenwerte mit 5 Nachkommastellen ausgeben
format long % Zahlenwerte mit 15 Nachkommastellen ausgeben
Nähere Informationen können unter
help format gefunden werden.
In Matlab wird jedem grafischen Objekt (wie Button, Eingabefeld, Checkbox usw.) eine eindeutige Zahl zugewiesen.
Diese Zahl wird Handle genannt und dient dazu, auf die grafischen Objekte zugreifen zu können. Viele Funktionen,
nutzen Handles, um Objekte eindeutig identifizieren zu können. Die bekanntesten Vertreter sind die Funktionen
set und
get, mit denen Objekteigenschaften verändert bzw. ausgelesen werden können.