|
|
Tutorial: Keine Angst vor dem function handle |
|
Bijick |
Ehrenmitglied
|
|
Beiträge: 914
|
|
|
|
Anmeldedatum: 18.06.07
|
|
|
|
Wohnort: Nürnberg
|
|
|
|
Version: R2006b, R2008b
|
|
|
|
|
|
Verfasst am: 14.12.2007, 16: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:
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:
Aufgerufen würde graph beispielsweise so:
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.
Aufgerufen würde graph dann so:
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
|
|
|
|
|
Dory |
Gast
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 04.11.2009, 11:35
Titel: Welchen Vorteil
|
|
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
|
|
Beiträge: 871
|
|
|
|
Anmeldedatum: 19.07.07
|
|
|
|
Wohnort: Aachen
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 04.11.2009, 16:22
Titel:
|
|
|
|
|
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:
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:
oder (wie früher, einfach nur den Funktionsnamen übergeben):
gibt es einen Fehler. Der Ausweg: entweder noch ein M-File schreiben, oder eine anonyme Funktion on the fly generieren:
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:
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, 11: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.
und dann habe ich eine Implementation von myFilter, die eine Matrix SubImg uebernimmt (die er von colfilt bekommt).
Jetzt wuerde ich noch gerne extra Parameter uebergeben, die ich selbst bestimme.
Irgendwas in der Art:
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
|
|
Beiträge: 180
|
|
|
|
Anmeldedatum: 23.09.09
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 07.12.2009, 11:24
Titel:
|
|
Hi
versuch mal das
Gruss Fragewurm
_________________
Fehler jeglicher Art Dienen zur allgemeinen Belustigung
|
|
|
maecky |
Forum-Newbie
|
|
Beiträge: 5
|
|
|
|
Anmeldedatum: 07.12.09
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 07.12.2009, 11:33
Titel:
|
|
Hi,
danke fuer die rasche Antwort, wenn man die geschwungenen Klammern weglaesst funktioniert es, ansonsten nicht
Aber dein Ansatz hat mich auf die richtige Loesung gebracht, thx
Gruss, Maecky
|
|
|
Gast |
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 16.11.2013, 13:05
Titel:
|
|
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
|
|
Beiträge: 24.493
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 16.11.2013, 13:12
Titel:
|
|
Hallo,
was genau versuchst du, und welche Fehlermeldung erhältst du?
Grüße,
Harald
|
|
|
Gast |
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 16.11.2013, 13:41
Titel:
|
|
genau genommen ist der erste code, der nicht funktioniert:
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
|
|
Beiträge: 24.493
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 16.11.2013, 13:59
Titel:
|
|
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
|
|
|
Gast |
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 16.11.2013, 14:40
Titel:
|
|
|
|
Gast |
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 16.11.2013, 14:40
Titel:
|
|
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!
|
|
|
suppl |
Gast
|
|
Beiträge: ---
|
|
|
|
Anmeldedatum: ---
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 01.08.2014, 00:46
Titel:
|
|
Hi, also erstmal Danke für Deinen Beitrag
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
|
|
Beiträge: 24.493
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 01.08.2014, 08:16
Titel:
|
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
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
| 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.
|
|