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 : @idigas