2009-08-14 7 views
7

Dans MATLAB, je peux définir plusieurs fonctions dans un seul fichier, seule la première fonction définie étant visible à l'extérieur de ce fichier. Alternativement, je peux mettre chaque fonction dans son propre fichier et les rendre globalement visibles à travers le chemin. J'écris une application pilotée par menu, où chaque élément de menu exécute une fonction différente. Actuellement, tout cela est dans un gros fichier, qui devient de plus en plus difficile à naviguer. Ce que je voudrais faire est de mettre des groupes de fonctions connexes dans des fichiers séparés.Comment émuler le comportement 'include' dans MATLAB?

Je pense que je peux faire quelque chose comme ceci en mettant toutes les fonctions enfants dans un répertoire séparé, puis en ajoutant le répertoire au chemin dans ma fonction parente, mais cela semble un peu brouillon et inélégant.

Quelqu'un peut-il faire une meilleure suggestion?

Note: Je suis plus familier avec Matlab 2006, mais je suis en train de mise à niveau vers 2009. Matlab

+0

Connexes: http://stackoverflow.com/questions/8883499/can-i-import-a-namespace-globally-without-calling-implicitly-import-in-each-and?lq=1 –

Répondre

14

Une suggestion, qui éviterait de devoir modifier le MATLAB path, consiste à utiliser un private function directory. Par exemple:

Disons que vous avez une fonction appelée test.m dans le répertoire \MATLAB\temp\ (qui est déjà sur le chemin d'accès MATLAB). S'il y a des fonctions locales dans test.m que vous voulez placer dans leurs propres fichiers m, et vous voulez seulement test.m pour y avoir accès, créez d'abord un sous-répertoire \MATLAB\temp\ appelé private. Ensuite, placez les fichiers m de la fonction locale individuelle de test.m dans ce sous-répertoire private.

Le sous-répertoire private n'a pas besoin d'être ajouté au chemin Matlab (en fait, il ne doit pas être ajouté à la voie pour que les choses fonctionnent correctement). Seul le fichier test.m et les autres fichiers m dans le répertoire situé immédiatement au-dessus du sous-répertoire private ont accès aux fonctions qu'il contient. En utilisant des fonctions privées, vous pouvez émuler efficacement le comportement de local functions (c'est-à-dire portée limitée, surcharge de fonction, etc.) sans avoir à mettre toutes les fonctions dans le même fichier m (qui peut devenir très gros pour certaines applications).

+0

Je ne savais pas que tu pouvais le faire. Je vais essayer de voir comment ça se passe. Au moins tous les fichiers de fonction seront cachés dans un coin tranquille! –

+1

Il semble que les documents liés à ici ont été supprimés! Les répertoires de fonctions privées sont-ils considérés comme obsolètes? – Dan

+1

@Dan: Non, pas obsolète. Juste un vieux, mauvais lien depuis TMW mis à jour leurs documents en ligne. J'ai modifié dans les nouveaux liens. – gnovice

5

Peut-être quelque chose comme ça,

function foobar 
    addpath C:\Include\ModuleX 

    %% Script file residing in ModuleX 
    some_func(); 
end 

Bien sûr, Modulex restera dans votre chemin de recherche après avoir quitté foobar. Si vous voulez le mettre sur le chemin par défaut sans redémarrer, puis ajoutez cette ligne:

path(pathdef) 

Voir ADDPATH pour plus de détails.

+0

+1 parce que est une solution raisonnable que j'avais envisagée. –

+0

Dans le cas où les fichiers sont dans une hiérarchie de dossiers, vous pouvez également tous les ajouter avec 'addpath (genpath (PATH)); Notez que la commande 'genpath' est généralement très lente. – tashuhka

1

Vous pouvez utiliser des sous-dossiers commençant par «+» pour séparer les fonctions en espaces de noms.

Par exemple:

place une fonction "bar" dans le dossier "+ foo"

function bar() 
print('hello world'); 

Cette fonction peut être utilisé comme:

foo.bar() % prints hello world 

Plus d'informations peuvent être trouvées ici:

What is the closest thing MATLAB has to namespaces?

Questions connexes