La première fonction d'un fichier m (c'est-à-dire le fichier fonction principale ), est invoqué lorsque ce m-file est appelé. Il n'est pas requis que la fonction principale ait le même nom que le fichier m, mais pour plus de clarté, il devrait . Lorsque la fonction et le nom du fichier diffèrent, le nom du fichier doit être utilisé pour appeler la fonction principale.
Toutes les fonctions suivantes du fichier m, appelées fonctions locales (ou "sous-fonctions" dans l'ancienne terminologie), ne peuvent être appelées que par la fonction principale et les autres fonctions locales de ce m-file. Les fonctions d'autres fichiers m ne peuvent pas les appeler. À partir de R2016b, vous pouvez ajouter des fonctions locales aux scripts également, bien que le comportement de scoping soit toujours le même (c'est-à-dire qu'ils ne peuvent être appelés que depuis l'intérieur du script).
En outre, vous pouvez également déclarer des fonctions sur d'autres fonctions. Ces fonctions sont appelées fonctions imbriquées et celles-ci ne peuvent être appelées qu'à l'intérieur de la fonction dans laquelle elles sont imbriquées. Elles peuvent également avoir accès aux variables des fonctions dans lesquelles elles sont imbriquées, ce qui les rend très utiles, même si leur utilisation est un peu délicate.
Plus d'éléments de réflexion...
Il existe quelques moyens de contourner le comportement normal de délimitation de la fonction décrit ci-dessus, comme le passage de poignées de fonction comme arguments de sortie, comme mentionné dans les réponses de SCFrench y Jonas (ce qui, à partir de R2013b, est facilité par l'option localfunctions
fonction). Cependant, je ne suggérerais pas de prendre l'habitude de recourir à de telles astuces, car il existe probablement de bien meilleures options pour organiser vos fonctions et vos fichiers.
Par exemple, disons que vous avez une fonction principale A
dans un fichier m A.m
ainsi que les fonctions locales D
, E
y F
. Maintenant, disons que vous avez deux autres fonctions connexes B
y C
dans les m-files B.m
y C.m
respectivement, que vous voulez également pouvoir appeler D
, E
y F
. Voici quelques options qui s'offrent à vous :
-
Mettez D
, E
y F
chacun dans leurs propres fichiers m séparés, permettant à toute autre fonction de les appeler. L'inconvénient est que le champ d'application de ces fonctions est large et ne se limite pas seulement à A
, B
y C
mais l'avantage est que c'est assez simple.
-
Créer un defineMyFunctions
m-file (comme dans l'exemple de Jonas) avec D
, E
y F
en tant que fonctions locales et une fonction principale qui leur renvoie simplement des handles de fonctions. Cela vous permet de conserver D
, E
y F
dans le même fichier, mais cela ne fait rien concernant la portée de ces fonctions puisque toute fonction qui peut appeler defineMyFunctions
peut les invoquer. Vous devez également vous préoccuper de faire passer les gestionnaires de fonctions en tant qu'arguments pour être sûr de les avoir là où vous en avez besoin.
-
Copie D
, E
y F
en B.m
y C.m
comme des fonctions locales. Cela limite la portée de leur utilisation à A
, B
y C
Mais la mise à jour et la maintenance de votre code sont un cauchemar car vous avez trois copies du même code à différents endroits.
-
Utilisez fonctions privées ! Si vous avez A
, B
y C
dans le même répertoire, vous pouvez créer un sous-répertoire appelé private
et place D
, E
y F
là-dedans, chacun comme un fichier m séparé. Cela limite leur portée de sorte qu'elles ne peuvent être appelées que par des fonctions situées dans le répertoire immédiatement supérieur (c'est-à-dire A
, B
y C
) et les garde ensemble au même endroit (mais toujours avec des m-files différents) :
myDirectory/
A.m
B.m
C.m
private/
D.m
E.m
F.m
Tout ceci sort un peu du cadre de votre question, et est probablement plus détaillé que ce dont vous avez besoin, mais j'ai pensé qu'il serait bon d'aborder le problème plus général de l'organisation de tous vos fichiers m. ;)