MATLAB-Skripts sind Programme, die im MATLAB-Arbeitsbereich (Workspace) ablaufen und keine Übergabeparameter kennen. Ihnen sind alle definierten Variablen im Workspace (who) bekannt, zwei unterschiedliche Skripts können also wechselseitig Variablen benutzen oder überschreiben. Das kann einerseits praktisch sein, birgt aber andererseits auch große Gefahren unerwünschter Beeinflussung. Will man sicher sein, dass Skripts in einem ''reinen'' Workspace ablaufen, muss man den Befehl clear all verwenden.
MATLAB-Funktionen 7.1 hingegen werden in einem eigenen Arbeitsbereich abgearbeitet. Hier gibt es also keine unerwünschten Querverbindungen. Ihre Kommunikation mit Skripts (oder anderen Funktionen) erfolgt durch sogenannte Übergabeparameter,
function [out1,out2,out3] = test(in1,in2,in3)wobei die Position innerhalb der Klammern die Zuordnung bestimmt. Ein Aufruf der Funktion
test in folgender Art,
[a,b,c] = test(x,y,z)führt innerhalb der Funktion dazu, dass
in1 den Wert von x,
in2 den Wert von y und in3 den Wert von z
zugewiesen bekommt.
Nach Ablauf aller Programmschritte innerhalb der Funktion test, wobei
die Werte für out1, out2 und out3 berechnet werden
müssen, bekommt ausserhalb der Funktion die Variablen a den Wert von
out1, b den Wert von out2 und c den Wert von
out3.
Der lokale Arbeitsbereich einer Funktion ist bei jedem Aufruf leer. Nach dem Aufruf sind also nur die Input-Parameter bekannt. In Funktionen können natürlich genauso wie in Skripts alle MATLAB-Befehle und eigene Programme verwendet werden.
Zwei Regeln müssen bei Funktionen unbedingt eingehalten werden. Erstens, die
Funktion muss in einem gleichnamigen MATLAB-File abgespeichert werden, d.h.,
die Funktion test muss im File test.m gespeichert werden und
steht dann unter dem Namen test zur Verfügung. Dabei soll man
keinesfalls existierende MATLAB Funktionsnamen (exist) verwenden,
da sonst deren Zugänglichkeit blockiert ist. Zweitens, muss die Funktion eine
sogenannte Deklarationszeile enthalten, die den Funktionsnamen und die Namen
(und somit die Anzahl) der Übergabeparameter enthält. Diese Zeile muss mit
function
beginnen (siehe oben).
Eine einfache Funktion mit zwei Input- und zwei Output-Parametern könnte so aussehen:
function [a,b] = test_fun1(x,y) % TEST_FUN1 - Test Function % Syntax: [a,b] = test_fun1(x,y) % Input: x,y - Array (same size) % Output: a,b - Array (same size as x and y) % a = sqrt(x.^2 + y.^2); % b = exp(-a.^2) a = x.^2 + y.^2; % ist eigentlich a.^2 b = exp(-a); a = sqrt(a);Sie besteht aus einer Deklarationszeile, einer Reihe von Kommentarzeilen, die mit dem Befehl help angezeigt werden können, und drei Programmzeilen zur Berechnung der Output-Parameter. Beachten Sie bitte die Verwendung des Operators
.^, da es sich bei den Übergabegrößen um
Felder handeln kann (elementweise Berechnung).
Das entsprechende Skript zum Aufruf der Funktion könnte so aussehen:
% Test-Skript for test_fun1.m
% Winfried Kernbichler 08.03.2004
z_max = 1; z_n = 101; % Prepare input
z_1 = linspace(-z_max, z_max, z_n);
[d, e] = test_fun1(z_1, -z_1); % Call function
figure(1); % Plot output
plot(z_1,d,'r',z_1,e,'b:');
xlabel('z_1'); ylabel('f(z_1,-z_1)');
legend('Distance','Exponent');
title('Result of test_fun1');
Im aufrufenden Skript werden typischerweise die Input-Parameter vorbereitet
und die Ergebnisse dargestellt. Man trennt damit das ''Umfeld'' von der
eigentlichen Berechnung.
Will man mit dem Benutzer des Programmes kommunizieren, kann man zur Eingabe
von z_max und z_n auch den Befehl input
eventuell in
folgender Form verwenden:
z_max = input('Bitte geben Sie z_max ein: ');
Manchmal möchte man eine Funktion auch für die Erledigung unterschiedlicher Aufgaben verwenden. Dazu bietet sich die Verwendung der Steuerstruktur switch an. Bei dieser Steuerstruktur wird eine Schaltvariable switch benutzt. Für verschiedene Werte dieser Schaltvariablen können dann Fälle (case) und entsprechende Aktionen programmiert werden.
function [a,b] = test_fun2(typ,x,y)
% TEST_FUN2 - Test Function
% Syntax: [a,b] = test_fun2(typ,x,y)
% Input: typ - String
% x,y - Array (same size)
% Output: a,b - Array (same size as x and y)
% a = sqrt(x.^2 + y.^2);
% b = exp(-a.^2) [typ: 'exp']
% b = sech(-a.^2) [typ: 'sech']
a = x.^2 + y.^2;
switch typ
case 'exp'
b = exp(-a);
case 'sech'
b = sech(-a);
otherwise
error('Case not defined!')
end
a = sqrt(a);
Je nach Wert der der Variablen typ kann die Funktion nun zwei
verschiedene Aufgaben erledigen. Eine genaue Beschreibung von
Steuerstrukturen finden Sie im Abschnitt 6, Details
zum Befehl switch
finden Sie im
Abschnitt 6.2.2.
Der Aufruf schaut nun ein wenig anders aus (typ):
% Test-Skript for test_fun2.m
% Winfried Kernbichler 08.03.2004
z_max = 1; z_n = 101; % Prepare input
typ = 'exp'; % oder 'sech'
z_1 = linspace(-z_max, z_max, z_n);
[d, e] = test_fun2(typ,z_1, -z_1); % Call function
figure(1); % Plot output
plot(z_1,d,'r',z_1,e,'b:');
xlabel('z_1'); ylabel('f(z_1,-z_1)');
legend('Distance',typ);
title('Result of test_fun2');
Anmerkung: Will man mit der Funktion input
den Wert der
Variablen typ abfragen, empfiehlt es sich, sie in dieser Form
typ = input('Bitte geben Sie den Typ ein: ','s')
zu verwenden. Damit kann man einfach exp anstelle von 'exp'
eingeben und MATLAB erkennt trotzdem, dass es sich um einen String
handelt.
Anmerkung: Will man die Eingabe des Typs noch weiter erleichtern (Groß- oder Kleinschreibung, nur Anfangsbuchstabe(n), kann man die switch-Konstruktion verbessern. Man kann z.B. alle Zeichenketten mit dem Befehl lower in Kleinbuchstaben verwandeln. Details zur Verwendung von Zeichenketten findet man im Abschnitt 9. Die Konstruktion
switch lower(typ)
case 'exp'
...
end
würde nun auch mit Werten wie Exp oder EXP funktionieren. Will
man nur den Anfangsbuchstaben der Zeichenkette auswerten, kann man mit Hilfe
der Indizierung auf den ersten Buchstaben zugreifen. Dies könnte so
aussehen:
switch lower(typ(1))
case 'e'
...
end
Winfried Kernbichler 2005-04-26