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 ...
Réponses
Trop de publicités?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 import
s 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
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.
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.
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.