web-dev-qa-db-fra.com

Vous exécutez un fichier ou un appel dont le fichier est placé dans un autre dossier avec MATLAB?

Essayé googler , mais je n'ai rien trouvé.
J'ai quelques fichiers et dossiers dans mon dossier MATLAB actuel.
L'un de ces dossiers s'appelle 'Map' et contient un fichier 'map1.m' que je souhaite appeler à partir de mon code situé dans le dossier MATLAB actuel.
Dans mon code, je ne peux pas l'appeler ainsi: 

/Map/map1;

mais je peux le faire comme ça:

cd Map;
map1;
cd ..;

D'une certaine manière, la méthode ci-dessus semble incorrecte. Y a-t-il une manière plus élégante de le faire?

25
Nav

Vous pouvez exécuter le fichier sans ajouter le dossier à votre chemin manuellement, à l’aide de la commande run , qui est spécifiquement destinée à de tels cas. De la documentation:

run est une fonction pratique qui exécute des scripts qui ne sont pas actuellement sur le chemin. 

Vous appelez votre fonction/script comme 

run /Map/map1 

Si vous souhaitez exécuter la fonction/le script en saisissant simplement son nom et non avec le chemin complet (ou relatif), vous devez ajouter le dossier à votre chemin.

Comme l'a noté @mutzmatron, vous ne pouvez pas utiliser run pour appeler des fonctions avec des arguments d'entrée/sortie. Donc, sauf s'il s'agit d'un script/d'une fonction sans arguments d'entrée/sortie, utiliser run ne fonctionnera pas et vous devrez ajouter le dossier à votre chemin.


MODIFIER

Pour des bonnes pratiques de codage et pour travailler dans les cas où votre fonction a des entrées/sorties, ajouter/supprimer le dossier de votre chemin est la bonne façon de procéder. Donc pour ton cas,

addpath /Map
...

map1;

...
rmpath /Map

L'important est que votre appel de fonction soit pris en sandwich entre les commandes addpath et rmpath. Si vous avez des fonctions du même nom dans les deux dossiers, vous devriez alors l’intercaler plus étroitement, c’est-à-dire une ligne avant et une ligne après, afin d’éviter les conflits.

36
abcd

Ajoutez simplement tous ces répertoires au chemin Matlab avec addpath comme le suggère gnovice. Vous pourrez ensuite appeler les fonctions normalement, et elles seront visibles pour lesquelles (), help (), depfun () et les autres commandes de méta-programmation Matlab. Vous pouvez placer les appels addpath() dans votre fichier startup.m pour les afficher automatiquement à chaque démarrage de Matlab.

Changer le chemin avec addpath/map1 ()/rmpath présente à chaque fois des inconvénients. 

  • C'est un coup dur pour les performances, car vous ajoutez une manipulation de chemin à chaque appel. 
  • Les fonctions de différents répertoires ne pourront pas se voir.
  • Il sera plus difficile d'écrire et de déboguer des fonctions car le contexte du chemin dans lequel elles s'exécutent changera de manière dynamique et ne sera pas identique à ce que vous verrez lorsque vous serez dans l'éditeur et dans l'espace de travail de base.
  • Vous avez besoin d'un code supplémentaire de gestion des erreurs pour vous assurer que le chemin est correctement restauré si la fonction appelée présente une erreur.
  • Cela ne fonctionnera pas avec le compilateur Matlab, si vous souhaitez déployer ce code à un moment donné.

Et utiliser run () ou cd () vous-même est moche, car les chemins relatifs vont poser des problèmes.

Si vous voulez vraiment séparer les fonctions des sous-répertoires pour qu’elles ne puissent pas se "voir", vous pouvez créer ces espaces de noms de répertoires en mettant un "+" devant leurs noms, puis qualifier les appels de fonction avec l’espace de noms, comme Map.map1().

7
Andrew Janke

Juste pour contribuer au débat qui modifie la trajectoire ...

Une façon de le rendre "plus sûr" est d'écrire

% start of my code: create function handles 
% to the functions I need:
try
   cd Map
   map1_func = @map1;
catch mexception
end
cd ..

Cela tente de conserver le répertoire actuel et vous obtenez un descripteur de la fonction dans un autre répertoire.

Le seul problème est que cette méthode ne [] ne fonctionnera pas si map1 s'appuie sur d'autres fonctions du répertoire Map.

0
Sanjay Manohar