Softwareentwickler MATLAB/Simulink (w/m) Erarbeitung von Lösungen im Bereich der Schnittstelle zum Simulink-Modell und der Benutzeroberfläche von TargetLinkdSPACE GmbH - Paderborn
Verfasst am: 14.12.2007, 17:01
Titel: Tutorial: Keine Angst vor dem function handle
Dieses Tutorial möchte zwei Fragen zu einem sehr nützlichen Instrument beantworten, das Matlab-Neuling zunächst leider nur verwirrt:
1. Was ist ein function handle?
2. Wofür braucht man das und wie programmiert man das?
Los geht's.
Was also ist ein function handle?
Das englische Wort "handle" bedeutet zunächst mal Griff, "to handle" steht für handhaben, verarbeiten oder beherrschen. Folgerichtig dient ein function handle dazu, eine Funktion in den Griff zu bekommen, sie handhaben und verarbeiten zu können. Diese Funktionen können gleichermaßen Matlab-Funktionen (exp, sin, polyval,...) und eigene Funktionen (mit Schlüsselwort function oder anonyme) sein. Hier die Syntax und einige Beispiele:
% Beispiele
h1 = @sin;
h2 = @myfun; % dazu beispielsweise function f = myfun(x), f = prod(cos(x))+sum(x.^2);
h3 = @(x,y)3*x.*y+2*x-y+4;
h1, h2 und h3 sind damit "ganz normale Variablen", deren Einträge function handles sind. Man kann sie zwar nicht addieren etc. aber beispielsweise an andere Funktionen übergeben. Und damit kommen wir zur zweiten Frage.
Wann und wie verwendet man function handles?
Man braucht sie überall dort, wo die Funktion selbst variabel sein soll, also mal die eine, mal eine andere Funktion verwendet werden soll. Ein einfaches Beispiel ist die Nullstellensuche. Von was soll nämlich eine Nullstelle gefunden werden? Von einer Funktion. Um Matlab nun "mitzuteilen", von welcher Funktion eine Nullstelle gesucht ist, übergibt man an fzero ihr function handle. (fzero ist die in Matlab implementierte Nullstellensuche.) Das geht so:
So übergibt man auch die Zielfunktionen an alle Matlab-Optimierungsalgorithmen.
Ein weiterer Anwendungsfall tritt auf, wenn ein unbekannter Benutzer (oder man selbst in der Zukunft) die Funktion bestimmt, mit der etwas geschehen soll. Angenommen, wir sollen eine Graphikfunktion schreiben, die zu einer (univariaten) Funktion den Graphen über einem angegebenen Intervall zeichnet. Dann könnten wir erst mal versuchen, mit switch alle Fälle abzufangen:
Aber der Benutzer könnte ja auch eine ganz andere Funktion eingeben. Wie können wir unsere Funktion für beliebige Graphen erweitern? Mit dem function handle natürlich.
Code:
function graph(fhandle,range)
t = linspace(range(1),range(2),100);
plot(t,fhandle(t))
erstmal super, dass es deinen Beitrag gibt, hat mir immerhin schon mal ein bisschen weitergeholfen.
Aber ich verstehe leider immernoch nicht, was jetzt der letztendliche Vorteil eines function handles ist.
Könntest mir da vielleicht noch auf die Sprünge helfen? Dass es letztendlich doch noch klick macht?
meine Lieblingsanwendung ist die Kombination von anonymen Funktionen und den sogenannten Functionfunctions, also Funktionen, die eine Funktion als Argument brauchen (fzero, fminsearch, ode45 etc.).
Nehme an, ich habe eine Datei geschrieben, die so aussieht:
Code:
function y = myComplicatedFunction(x, a)
y = a * exp(x);
Diese möchte ich integrieren von 0 bis 2. Aber: quad will eine Funktion übergeben haben, die nur von x abhängt. Wenn ich also probiere:
gibt es einen Fehler. Der Ausweg: entweder noch ein M-File schreiben, oder eine anonyme Funktion on the fly generieren:
Code:
a = 2;
val = quad(@(x) myComplicatedFunction(x, a), 0, 2);
Der zweite Vorteil gegenüber dem String als Funktionsnamen ist der scope (hier wirds etwas komplizierter): wenn ich obiges in einer M-Function mache, wobei myComplicatedFunction eine Unterfunktion ist, dann funktioniert das nur mit dem function handle, selbst wenn wir die Problematik mit dem extra Parameter mal weglassen:
% folgendes funktioniert
val = quad(@mySimpleFunction, 0, 2);
% folgendes funktioniert nicht:
val = quad('mySimpleFunction', 0, 2);
function y = mySimpleFunction(x)
a = 2;
y = a * exp(x);
Warum? Der Functionhandle schaut nach, was "mySimpleFunction" ist, in dem Moment, wo er erzeugt wird. Zu dem Zeitpunkt ist die Unterfunktion bekannt. Der String wird erst aufgelöst beim Funktionsaufruf. Aber innerhalb von quad ist die Unterfunktion aus einer anderen Datei nicht bekannt und es gibt einen Fehler.
Titus
maecky
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 07.12.2009, 12:17
Titel:
Hi, ich weiss, der Thread ist schon aelter aber meine Frage passt hier super rein .
Ich verwende die Matlab Funktion colfilt und diese nimmt ja auch ein function handle.
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.