WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Tutorial: Keine Angst vor dem function handle

 

Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 14.12.2007, 16:01     Titel: Tutorial: Keine Angst vor dem function handle
  Antworten mit Zitat      
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:
Code:
% Syntax
handle = @functionname
handle = @(arglist) anonymous_function

% 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:

Code:
h1=@sin;
x_start = 3;
x0 = fzero(h1,x_start)

% oder x0 = fzero(@sin,3)
 

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:
Code:
function graph(fstring, range)
t = linspace(range(1),range(2),100);
switch fstring
case 'sin'
plot(t,sin(t));
case 'cos'
plot(t,cos(t));
case 'exp'
plot(t,exp(t))
end
 

Aufgerufen würde graph beispielsweise so:
Code:
Intervall=[-pi,pi];
fstring='sin';
graph(fstring,Intervall)
 

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))


Aufgerufen würde graph dann so:
Code:
Intervall=[-pi,pi];
fh=@(x) exp(x.^2);
graph(fh,Intervall)


Man sieht an "fhandle(t)", dass man für Funktionsauswertungen den "Griff" fhandle genauso verwenden kann wie den Funktionsnamen selbst.

War doch gar nicht so schwer, oder?


Fragen und Bemerkungen sind natürlich erwünscht. Ich versuche dann, das Tutorial dementsprechend zu verbessern.
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden


Dory

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.11.2009, 11:35     Titel: Welchen Vorteil
  Antworten mit Zitat      
Hallo,

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?

Danke!
 
Titus
Forum-Meister

Forum-Meister


Beiträge: 871
Anmeldedatum: 19.07.07
Wohnort: Aachen
Version: ---
     Beitrag Verfasst am: 04.11.2009, 16:22     Titel:
  Antworten mit Zitat      
Hallo,

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:
Code:
a = 2;
val = quad(@myComplicatedFunction, 0, 2);
 

oder (wie früher, einfach nur den Funktionsnamen übergeben):
Code:
a = 2;
val = quad('myComplicatedFunction', 0, 2);
 

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:
Code:
function callMySimpleFunction

% 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
Private Nachricht senden Benutzer-Profile anzeigen
 
maecky

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.12.2009, 11:17     Titel:
  Antworten mit Zitat      
Hi, ich weiss, der Thread ist schon aelter aber meine Frage passt hier super rein Wink.

Ich verwende die Matlab Funktion colfilt und diese nimmt ja auch ein function handle.

Code:

Img(:,:,1) = uint8(colfilt(Img(:,:,1),[25 25],'sliding', @myFilter));
 


und dann habe ich eine Implementation von myFilter, die eine Matrix SubImg uebernimmt (die er von colfilt bekommt).
Code:

function[rueck] = myFilter(SubImg)
 


Jetzt wuerde ich noch gerne extra Parameter uebergeben, die ich selbst bestimme.
Irgendwas in der Art:
Code:

function[rueck] = myFilter(SubImg, x, y)
 

Und diese Parameter (x und y) wuerde ich gerne beim Aufruf von colfilt mitgeben.
Geht das ueberhaupt?
Kann mir wer weiterhelfen?

Danke im Voraus
lG maecky
 
Fragewurm
Forum-Century

Forum-Century


Beiträge: 180
Anmeldedatum: 23.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.12.2009, 11:24     Titel:
  Antworten mit Zitat      
Hi
versuch mal das
Code:

...,{@myFilter,x,y})
 


Gruss Fragewurm
_________________

Fehler jeglicher Art Dienen zur allgemeinen Belustigung
Private Nachricht senden Benutzer-Profile anzeigen
 
maecky
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 07.12.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.12.2009, 11:33     Titel:
  Antworten mit Zitat      
Hi,
danke fuer die rasche Antwort, wenn man die geschwungenen Klammern weglaesst funktioniert es, ansonsten nicht Wink

Aber dein Ansatz hat mich auf die richtige Loesung gebracht, thx Wink

Code:

I(:,:,1) = uint8(colfilt(I(:,:,1),[x y],'sliding', @myFilter, x, y));
 



Gruss, Maecky
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.11.2013, 13:05     Titel:
  Antworten mit Zitat      
Danke für eure Mühe, aber egal welchen ich von euren obigen Codes probiere, bei mir kommen nur Fehlermeldungen. Hat sich Matlab in der Zeit so arg verändert? Ich nutze Matlab R2012b.
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.11.2013, 13:12     Titel:
  Antworten mit Zitat      
Hallo,

was genau versuchst du, und welche Fehlermeldung erhältst du?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.11.2013, 13:41     Titel:
  Antworten mit Zitat      
genau genommen ist der erste code, der nicht funktioniert:

Code:
function graph(fstring, range)
t = linspace(range(1),range(2),100);
switch fstring
case 'sin'
plot(t,sin(t));
case 'cos'
plot(t,cos(t));
case 'exp'
plot(t,exp(t))
end


Fehlermeldung:
function graph(fstring, range)
|
Error: Function definitions are not permitted in this context.


Mir ist Matlab auch noch relativ neu, denn meine Kenntnisse beschränken sich auf Matrizen-Berechnung nur jetzt benötige ich function handle für eine Numerik-Übung. Was mache ich falsch?

Vielen Dank für deine schnelle Reaktion.
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 16.11.2013, 13:59     Titel:
  Antworten mit Zitat      
Hallo,

eine Funktion muss immer in einer eigenen Datei, d.h. in einem eigenen Editorfenster stehen.
Insbesondere muss der Aufruf einer Funktion aus dem Command Window oder einem anderen Skript / einer anderen Funktion erfolgen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.11.2013, 14:40     Titel:
  Antworten mit Zitat      
http://www.gomatlab.de/funktionsdef.....nicht-erlaubt-t18526.html

Da habe ich eine gute Antwort auf mein Problem gefunden.
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.11.2013, 14:40     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
Hallo,

eine Funktion muss immer in einer eigenen Datei, d.h. in einem eigenen Editorfenster stehen.
Insbesondere muss der Aufruf einer Funktion aus dem Command Window oder einem anderen Skript / einer anderen Funktion erfolgen.

Grüße,
Harald

Ach jo danke auch Dir nochmal! Smile
 
suppl

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.08.2014, 00:46     Titel:
  Antworten mit Zitat      
Hi, also erstmal Danke für Deinen Beitrag Smile

Verstanden habe ich folgendes:

@sin übergibt zb die Sinusfunktion, auf der dann irgendwas gemacht wird.

Was ist aber mit @(x) myComplicatedFunction(x, a) ?

Bedeutet dass, dass die Funktion myComplicatedFunction ist und die Laufvariable x sein soll?
Demnach müsste, wenn ich @(a) myComplicatedFunction(x, a) übergebe, das x fest vorgegeben sein und a als die Variable verwendet werden?
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 01.08.2014, 08:16     Titel:
  Antworten mit Zitat      
Hallo,

wenn ich dich richtig verstanden habe: ja ;)

Siehe auch hier:
http://www.mathworks.com/help/optim.....ing-extra-parameters.html

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.