53 votes

Quelle est la différence entre MATLAB et les espaces de noms?

Nous avons beaucoup de code MATLAB dans mon laboratoire. Le problème est qu'il n'y a vraiment aucun moyen de l'organiser. Étant donné que toutes les fonctions doivent figurer dans le même dossier pour être appelées (ou que vous devez ajouter une série de dossiers à la variable d'environnement path de MATLAB), il semble que nous soyons condamnés à avoir des charges de fichiers dans le répertoire. même dossier, tous dans l'espace de noms global. Existe-t-il une meilleure façon d’organiser nos fichiers et nos fonctions? J'aimerais vraiment qu'il y ait une sorte de système de module ...

71voto

kwatford Points 11658

MATLAB a une notion de paquets qui peuvent être imbriquées et comprennent à la fois des classes et des fonctions.

Il suffit de faire un répertoire quelque part sur votre chemin avec une + comme premier caractère, comme +mypkg. Alors, si ce n'est une classe ou d'une fonction dans ce répertoire, il peut être dénommé mypkg.mything. Vous pouvez également importer à partir d'un package à l'aide de import mypkg.mysubpkg.*.

L'une des principales gotcha sur le déplacement d'un tas de fonctions dans un package, c'est que les fonctions et les classes ne sont pas automatiquement importer le package qu'ils vivent dans des. Cela signifie que si vous avez un tas de fonctions dans les différents m-files qui s'appellent les uns les autres, vous pouvez avoir à dépenser un tout en déposant imports ou de qualification des appels de fonction. Ne pas oublier de mettre les importations en subfunctions qui appeler ainsi. Plus d'infos:

http://www.mathworks.com/help/matlab/matlab_oop/scoping-classes-with-packages.html

9voto

Jonas Points 54073

Je ne vois pas le problème d'avoir à ajouter un dossier à Matlab chemin de recherche. J'ai modifié startup.m donc récursivement la recherche des répertoires dans mon répertoire de démarrage de Matlab, et les ajoute au chemin (il fonctionne aussi svn update sur tout). De cette façon, si je change la structure de répertoire, Matlab est toujours d'aller voir de toutes les fonctions de la prochaine fois que je le démarre.

Sinon, vous pouvez regarder dans le code orienté objet, où vous stockez toutes les méthodes dans un @objectName dossier. Cependant, cela peut conduire à beaucoup de re-écrire du code qui peut être évité par la mise à jour de la trajectoire (il y a même un bouton add with subfolders si vous ajouter le dossier dans le chemin d'accès de l' File menu) et de faire un peu de déplacer le code.

MODIFIER

Si vous souhaitez organiser votre code, de sorte que certaines fonctions ne sont visibles que par les fonctions qu'appeler directement (et si vous ne voulez pas de le ré-écrire en programmation orientée objet), vous mettez l'appel de fonctions dans un répertoire, et dans ce répertoire, vous créez un sous-répertoire appelé private. Les fonctions dans les, il ne sera visible que pour les fonctions dans le répertoire parent. Ceci est très utile si vous avez de la surcharge de certaines intégré dans les fonctions Matlab pour un sous-ensemble de votre code.

8voto

Marc Points 1771

Une autre façon d'organiser et de réutilisation de code est d'utiliser matlab fonctionnalités orientées objet. Chaque Objet est habituellement dans un dossier qui commence par un "@" et le fichier(s) pour la classe à l'intérieur. (bien que la nouvelle syntaxe ne l'exige pas pour une classe définie dans un fichier unique.) À l'aide de dossiers privés à l'intérieur de la classe des dossiers, matlab prend même en privé aux membres de la classe. Matlab nouvelle catégorie de notation est relativement complet, mais même l' ancienne syntaxe est utile.

BTW, mon startup.m qui examine un emplacement bien connu que je fais de mon SVN extractions, et ajoute tous les sous-dossiers sur mon chemin d'accès automatiquement.

6voto

Marc Points 2275

Le système de paquets est probablement le meilleur. J'utilise le système de classe (@ClassName dossier), mais j'ai vraiment écrire des objets. Si vous n'êtes pas faire ça, c'est stupide juste pour écrire un tas de méthodes statiques. Une chose qui peut être utile est de mettre tout votre code matlab dans un dossier qui n'est pas sur le matlab chemin. Ensuite, vous pouvez choisir d'ajouter le code, vous devez le chemin.

Donc, dire, vous avez deux projets, stockés dans des "c:\matlabcode\foo" et "c"\matlabcode\bar", qui à la fois, utiliser le bon code stocké dans "c:\matlabcode\common" vous pourriez avoir une fonction "setupPaths.m" comme ceci:

function setupPaths(projectName)
basedir = fullfile('c:', 'matlabcode');
addpath(genpath(fullfile(basedir, projectName)));
switch (projectName)
   case {'foo', 'bar'}
       addpath(genpath(fullfile(basedir, 'common')));
end

Bien entendu, on pourrait étendre cette. Un évident extension serait d'inclure un fichier texte dans chaque répertoire de dire ce que d'autres répertoires doit être ajouté au chemin d'accès pour utiliser les fonctions dans ce répertoire.

Une autre chose utile si vous partagez le code est à mettre en place un "spécifique à l'utilisateur/LabMember" structure de répertoire où vous avez différents membres du laboratoire enregistrer le code ils travaillent. De cette façon, vous avez accès à leur code si vous en avez besoin, mais ils ne sont pas assommé quand ils écrivent une fonction avec le même nom que l'un des vôtres.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X