Gewusst wie: ausführen mehrerer Anweisungen in einer MATLAB-anonym-Funktion?
Ich würde gerne etwas wie das hier tun:
>> foo = @() functionCall1() functionCall2()
So, dass wenn ich gesagt habe:
>> foo()
Es würde ausführen functionCall1()
und führen Sie dann functionCall2()
. (Ich fühle, dass ich brauche so etwas wie die C , operator)
EDIT:
functionCall1
und functionCall2
sind nicht unbedingt die Funktionen, die Werte zurückgeben.
Tun functionCall1 und functionCall2 jemals akzeptiert input-Werte? Wenn nicht, die Lösung gab ich unten sollte funktionieren. Wenn Sie akzeptieren Werte, meine Lösung könnte immer noch funktionieren, aber brauchen würde, einige änderungen.
Ich aktualisiert meine Antwort mit einem Beispiel für die übergabe von input-Argumente, nur für den Fall Sie es brauchen.
Ich aktualisiert meine Antwort mit einem Beispiel für die übergabe von input-Argumente, nur für den Fall Sie es brauchen.
InformationsquelleAutor Daniel LeCheminant | 2009-02-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen, alles zu tun, über die Kommandozeile ohne speichern der Funktionen in m-Dateien kann eine komplizierte und unübersichtliche Unterfangen, aber hier ist ein Weg, ich kam mit...
Erstes anonyme Funktionen und setzen Ihre Griffe in einem cell array:
...oder, wenn Sie Funktionen, die bereits definiert (wie in m-Dateien), Stelle die Funktion verarbeitet in einem cell-array in etwa so:
Dann können Sie eine neue anonyme Funktion, die ruft jede Funktion im array mit Hilfe des built-in-Funktionen
cellfun
undfeval
:Zwar witzig aussieht, es funktioniert.
EDIT:, Wenn die Funktionen in
fcnArray
aufgerufen werden müssen mit der Eingabe-Argumente, würden Sie zunächst sicherstellen, dass ALLE Funktionen im array benötigen DIE GLEICHE Anzahl von Eingängen. In diesem Fall wird das folgende Beispiel zeigt, wie der Aufruf der array-Funktionen mit einem input-argument jeder:WORT DER WARNUNG: Die Dokumentation für
cellfun
besagt, dass die um, in dem die Ausgabe-Elemente berechnet werden, ist nicht angegeben und sollten nicht als verlässlich angesehen werden. Dies bedeutet, dass es gibt keine Garantien, dassfcn1
wird ausgewertet, bevorfcn2
oderfcn3
. Wenn die Bestellung ankommt, ist die obige Lösung nicht verwendet werden sollte.Interessant! Und natürlich könnte man nur erklären, fcnArray direkt ab, anstatt als separate variable, also so etwas wie:
myfun = @() cellfun(@feval,{@() xlim([1 5]), @() xlabel('seconds')});
Jetzt, ruft myfun setzt sowohl xlim und xlabel in der Abbildung.InformationsquelleAutor gnovice
Der anonymen Funktion syntax in Matlab (wie einige andere Sprachen) erlaubt nur einen einzigen Ausdruck. Darüber hinaus hat es verschiedene variable Bindung Semantik (Variablen, die nicht in der argument-Liste haben Ihre Werte lexikalisch gebunden an die Erstellung einer Funktion der Zeit, anstatt von Referenzen gebunden werden). Diese Einfachheit erlaubt es Mathworks, um einige Optimierungen hinter den kulissen und vermeiden Sie eine Menge von unordentlichen scoping und Lebensdauer von Objekten Probleme, wenn Sie Sie in Skripts.
Wenn Sie die Definition der anonymen Funktion innerhalb einer Funktion (kein Skript), können Sie benannte innere Funktionen. Innere Funktionen haben normale lexikalische Referenz verbindlich und erlauben eine beliebige Anzahl von Anweisungen.
Manchmal kann man sich mit tricks wie gnovice Vorschlag.
Vorsichtig sein, über die Verwendung von eval,... es ist sehr ineffizient (es umgeht die JIT) und Matlab s-Optimierer verwirrt zwischen den Variablen und Funktionen, die aus dem äußeren Rahmen, die verwendet werden, innerhalb der eval-Ausdruck. Es ist auch schwer zu Debuggen und/oder das Ausmaß code mit eval.
InformationsquelleAutor Mr Fooz
Hier ist eine Methode, mit der Garantie für die Ausführungsreihenfolge und das, (mit den erwähnten änderungen am Ende) erlaubt die übergabe unterschiedliche Argumente für unterschiedliche Funktionen.
Den Schlüssel
call1
fordert ein erstes argument und ignoriert Ihr zweites.call12
fordert sein erstes argument und dann die zweite, die Rückgabe der Wert aus der zweiten. Es funktioniert, weil eine Funktion nicht ausgewertet werden kann, bevor Ihre Argumente. Erstellen Sie Ihr Beispiel, würden Sie schreiben:Test-Code
Hier ist der test-code, den ich verwendet:
Aufrufen weitere Funktionen
Nennen Sie 3 Funktionen, könnten Sie schreiben,
4 Funktionen:
Weitere Funktionen, weiterhin die Verschachtelung Muster.
Argumente Übergeben
Wenn Sie müssen Argumente übergeben werden, Sie können schreiben, eine version von
call1
nimmt Argumente und dann machen die offensichtliche änderungcall12
.Können Sie auch Versionen von Ruf 1, die mehrere Argumente und mischen Sie und passen Sie diese entsprechend.
InformationsquelleAutor Eponymous
Wenn
functionCall1()
undfunctionCall2()
etwas zurückgeben und denen irgendwas verkettet werden kann, dann können Sie dies tun:>> foo = @() [functionCall1(), functionCall2()]
oder
>> foo = @() [functionCall1(); functionCall2()]
Ein Nebeneffekt dabei ist, dass
foo()
zurückkehren wird, die Verkettung von was auch immerfunctionCall1()
undfunctionCall2()
zurück.Ich weiß nicht, ob die Reihenfolge der Ausführung von
functionCall1()
undfunctionCall2()
gewährleistet ist.InformationsquelleAutor ManWithSleeve
Es ist möglich, mit dem curly - Funktion, die verwendet wird, um erstellen Sie eine durch Trennzeichen getrennte Liste.
InformationsquelleAutor Daniel
Vielleicht bin ich fehlen, somethign, nur eine Funktion combinationCall aufruft, beide Funktionen für Sie.
Sie könnte wahrscheinlich, aber warum die Mühe? Verwenden Sie ein Skript und eine Funktion, Datei. Es macht es leichter zu Durchlaufen und Ihre Arbeit ausführen der Treiber-Skript.
InformationsquelleAutor MatlabDoug