Die erste Funktion in einer M-Datei (dh die Hauptfunktion ) wird aufgerufen, wenn diese M-Datei aufgerufen wird. Es ist nicht erforderlich, dass die Hauptfunktion denselben Namen wie die m-Datei hat, dies sollte jedoch aus Gründen der Übersichtlichkeit der Fall sein . Wenn sich Funktion und Dateiname unterscheiden, muss der Dateiname zum Aufrufen der Hauptfunktion verwendet werden.
Alle nachfolgenden Funktionen in der M-Datei, die als lokale Funktionen (oder "Unterfunktionen" in der älteren Terminologie) bezeichnet werden, können nur von der Hauptfunktion und anderen lokalen Funktionen in dieser M-Datei aufgerufen werden. Funktionen in anderen M-Dateien können sie nicht aufrufen. Ab R2016b können Sie Skripten auch lokale Funktionen hinzufügen , obwohl das Gültigkeitsbereichsverhalten immer noch dasselbe ist (dh sie können nur innerhalb des Skripts aufgerufen werden).
Darüber hinaus können Sie Funktionen auch innerhalb anderer Funktionen deklarieren . Diese werden als verschachtelte Funktionen bezeichnet und können nur innerhalb der Funktion aufgerufen werden, in der sie verschachtelt sind. Sie können auch auf Variablen in Funktionen zugreifen, in denen sie verschachtelt sind. Dies macht sie sehr nützlich, wenn auch etwas schwierig zu bearbeiten.
Mehr Denkanstöße ...
Es gibt einige Möglichkeiten, um das oben beschriebene normale Verhalten des Funktionsumfangs zu umgehen, z. B. das Übergeben von Funktionshandles als Ausgabeargumente, wie in den Antworten von SCFrench und Jonas erwähnt (was ab R2013b durch die localfunctions
Funktion erleichtert wird ). Ich würde jedoch nicht empfehlen, es sich zur Gewohnheit zu machen, auf solche Tricks zurückzugreifen, da es wahrscheinlich viel bessere Möglichkeiten gibt, Ihre Funktionen und Dateien zu organisieren.
Zum Beispiel, sagen wir , Sie eine Hauptfunktion A
in einer m-Datei A.m
, zusammen mit lokalen Funktionen D
, E
und F
. Lassen Sie uns jetzt sagen , Sie haben zwei andere verwandte Funktionen B
und C
in m-Dateien B.m
und C.m
jeweils , dass Sie auch in der Lage sein nennen wollen D
, E
und F
. Hier sind einige Optionen, die Sie haben:
Setzen D
, E
und F
jeder in einem eigenen m-Dateien, andere Funktion erlaubt , sie zu nennen. Der Nachteil ist , dass der Umfang dieser Funktionen groß ist und nicht nur beschränkt A
, B
und C
, aber der Vorteil ist , dass dies ganz einfach.
Erstellen Sie eine defineMyFunctions
m-Datei (wie in Jonas 'Beispiel) mit D
, E
und F
als lokale Funktionen und einer Hauptfunktion, die einfach Funktionshandles an sie zurückgibt. Auf diese Weise können Sie und in derselben Datei behalten D
, dies hat jedoch keine Auswirkungen auf den Umfang dieser Funktionen, da jede Funktion, die sie aufrufen kann, sie aufrufen kann. Sie müssen sich dann auch darum kümmern, die Funktionshandles als Argumente weiterzugeben, um sicherzustellen, dass Sie sie dort haben, wo Sie sie benötigen.E
F
defineMyFunctions
Kopieren Sie D
, E
und F
in B.m
und C.m
als lokale Funktionen. Dies beschränkt den Umfang ihrer Verwendung auf nur A
, B
und C
macht die Aktualisierung und Wartung Ihres Codes zu einem Albtraum, da Sie drei Kopien desselben Codes an verschiedenen Orten haben.
Verwenden Sie private Funktionen ! Wenn Sie A
, B
und C
im gleichen Verzeichnis, können Sie ein Unterverzeichnis namens private
und Ort D
, E
und F
dort, das jeweils als eine separate m-Datei. Dies schränkt dessen Umfang , so dass sie nur durch Funktionen im Verzeichnis unmittelbar über aufgerufen werden können (dh A
, B
und C
) und hält sie zusammen an der gleichen Stelle (aber immer noch verschiedene m-Dateien):
myDirectory/
A.m
B.m
C.m
private/
D.m
E.m
F.m
All dies geht etwas über den Rahmen Ihrer Frage hinaus und ist wahrscheinlich detaillierter als Sie es benötigen, aber ich dachte, es wäre gut, auf das allgemeinere Anliegen der Organisation all Ihrer M-Dateien einzugehen. ;)
^
Antwortoption sieht so aus : @idigasIm Allgemeinen lautet die Antwort auf Ihre Frage "Nein". Sie können nicht mehr als eine extern sichtbare Funktion pro Datei definieren. Sie können Funktionshandles jedoch an lokale Funktionen zurückgeben. Eine bequeme Möglichkeit besteht darin, sie zu Feldern einer Struktur zu machen. Hier ist ein Beispiel:
Und so könnte es verwendet werden:
quelle
Die einzige Möglichkeit, mehrere separat zugängliche Funktionen in einer einzigen Datei zu haben, besteht darin, STATISCHE METHODEN mithilfe der objektorientierten Programmierung zu definieren . Sie würden die Funktion als Zugang
myClass.static1()
,myClass.static2()
usw.Die OOP-Funktionalität wird erst seit R2008a offiziell unterstützt. Wenn Sie also nicht die alte, nicht dokumentierte OOP-Syntax verwenden möchten, lautet die Antwort für Sie Nein, wie von @gnovice erläutert .
BEARBEITEN
Eine weitere Möglichkeit, mehrere Funktionen in einer Datei zu definieren, auf die von außen zugegriffen werden kann, besteht darin, eine Funktion zu erstellen, die mehrere Funktionshandles zurückgibt . Mit anderen Worten, Sie würden Ihre definierende Funktion als bezeichnen
[fun1,fun2,fun3]=defineMyFunctions
, wonach Sieout1=fun1(inputs)
usw. verwenden könnten .quelle
Die Antwort von SCFrench gefällt mir sehr gut - ich möchte darauf hinweisen, dass sie leicht geändert werden kann, um die Funktionen mithilfe der Zuweisungsfunktion direkt in den Arbeitsbereich zu importieren . (Wenn ich es so mache, erinnere ich mich sehr an Pythons "Import x from y" -Methode.)
Und dann so verwendet:
quelle
assignin('caller',...)
wäre korrekter. Möglicherweise möchten Sie diese Funktionen in einer anderen Funktion verwenden.In der gleichen Richtung wie die Antwort von SCFrench, jedoch mit einem C # -Stil.
Ich würde (und oft) eine Klasse erstellen, die mehrere statische Methoden enthält. Beispielsweise:
Da die Methoden statisch sind, müssen Sie die Klasse nicht instanziieren. Sie rufen die Funktionen wie folgt auf:
quelle
Ich definiere mit Octave mehrere Funktionen in einer .m-Datei und verwende dann den Befehl aus der .m-Datei, in der ich die Funktionen aus dieser Datei verwenden muss:
Ich bin mir nicht sicher, ob dies mit Matlab verfügbar ist.
quelle
Sie können Funktionen auch in einer Hauptdatei zusammen mit der Hauptfunktion gruppieren, die folgendermaßen aussieht:
Dann würde der Aufruf von subfun1 folgendermaßen aussehen: str = main ('subfun1')
quelle
Ab R2017b ist dies offiziell nicht möglich. In der entsprechenden Dokumentation heißt es:
In anderen Antworten vorgeschlagene Problemumgehungen können jedoch zu ähnlichen Ergebnissen führen.
quelle
Ich habe es mit dem SCFRench und mit dem Ru Hasha auf Oktave versucht .
Und schließlich funktioniert es: aber ich habe einige Änderungen vorgenommen
Kann in einer anderen 'm'-Datei aufgerufen werden:
aktualisieren:
Ich habe eine Antwort hinzugefügt, da weder die +72 noch die +20 für mich in Oktave arbeiteten . Der, den ich geschrieben habe, funktioniert perfekt (und ich habe ihn letzten Freitag getestet, als ich später den Beitrag schrieb).
quelle