Comment visualiser une structure de projet dans MATLAB? [fermé]

j'ai acquis la propriété de plusieurs milliers de lignes de code Matlab, certaines comme >900 fonctions de ligne et quelques répertoires remplis de fichiers function_name.m . Il est difficile de comprendre ce que tout fait (ou se rapporte à) ou de comprendre les dépendances. Que suggérez-vous pour visualiser la structure des fonctions, telles que quelles fonctions sont appelées d'où, et dans quelle séquence?

52
demandé sur Benjamin Oakes 2010-02-24 17:20:14

7 réponses

Port à NumPy.

(blague.)

Habituellement, dans Matlab vous avez des fichiers écrits comme des fonctions, et quelques scripts. Les Scripts font des choses comme charger les données que vous voulez traiter, et les transmettre aux fonctions, et les représenter graphiquement.

pour organiser les choses, je commencerais par le script de haut niveau et je découvrirais quelles fonctions font le chargement, le graphage, le traitement, etc. Garder les scripts dans un répertoire de haut niveau et essayer de séparer les fonctions en sous-répertoires, selon le but de la fonction. Mettre les dépendances d'une fonction dans le même sous-répertoire. Essayez de faire en sorte qu'aucun code dans un répertoire ne dépend de quelque chose dans un répertoire parent (ou cousin).

chaque fois que vous savez ce qu'une fonction fait et quels sont ses arguments, écrivez un commentaire doc.

Cela suppose que la personne qui a écrit le code était raisonnable. Si ce n'est pas le cas, Matlab facilite le plumage tout en bas dans un répertoire et avoir tout dépend de tout le reste dans une tour branlante de code, donc vous pouvez finir par faire beaucoup de remaniement.

42
répondu ptomato 2010-02-24 14:31:31

est-ce que votre code est fourni avec du texte d'aide décent? Dans ce cas, m2html va être une grande aide, car il vous permet de créer html aide liée pour une navigation facile.

en outre, il vous permet de faire des graphiques de dépendances, qui vous aident à comprendre un peu plus comment vous pouvez vouloir organiser le code.

14
répondu Jonas 2010-02-24 20:21:11

j'ai eu à faire face à ce problème à plusieurs reprises dans mes divers rôles au MathWorks. C'est ce que je fais pour les gros morceaux de code MATLAB:

  1. reculez, peut-être deux fois!
  2. Sélectionner tout, Ctrl-I à Smart indent
  3. tout Sélectionner, Ctrl-J pour envelopper les commentaires

  4. si je me sens sur papier-imprimer tous les fichiers, et obtenir un ensemble de surligneurs- suivez manuellement, en mettant en évidence les variables à long terme et les appels de fonction importants.

~ ~ ET / OU ~ ~ ~

5 Si je me sens chanceux, commencez à exécuter le code dans le débogueur, en passant une ligne à la fois (pas à pas dans subfunctions qui ont été utilisateur écrit)

à ce point, je peux passer et suivre un flux typique à travers la structure de contrôle. Je n'ai peut-être pas une grande idée de ce que tout fait, mais je en avoir une bonne idée de ce qui se passe.

Normalement, mon objectif est de trouver un bug, résoudre et d'avancer. Vos objectifs peuvent être totalement différents. C'est la méthode que j'ai utilisée pour comprendre rapidement hundereds de différents morceaux de code MATLAB que j'ai été envoyé au fil des ans.

13
répondu MatlabDoug 2010-02-24 14:50:04

MATLAB Programmation lignes Directrices de Style par Richard Johnson est une bonne ressource.

7
répondu Matthew Simoneau 2010-08-30 21:40:06

quelques suggestions sur Matlab convention de codage:

  1. utiliser addpath pour éviter l'encombrement des fichiers et aider dans les fonctions taxnomony

  2. break up section_ pour les scripts fonctionnels ou définis pour les lancements conditionnels, cela peut également aider dans les modules plug-in/ out et réutiliser ou référencement de code.

  3. utiliser un fichier de configuration pour activer et désactiver les options

  4. avoir un aperçu de l'ensemble architectural des constructions, ainsi que le modus operandi
  5. conservez un fichier statut / readme (traitez-vous comme un nouvel utilisateur, comment aideriez-vous à le rendre assimilable dans le cadre du module d'un nouvel utilisateur ou d'une partie des solutions de façon transparente? si vous revenez au code 3 mois plus tard en vous sentant perdu ou incapable de tracer - quelque chose ne va pas.) Ma suggestion: tenir un journal pour affiner vos pensées sur le maintien artful projet. Continue de perfectionner ton art!
  6. pour les équations, utilisez latex pour les documentations (et conservez-le dans un dossier voisin intitulé par ex. documents, s'assurer qu'ils sont facilement accessibles et traçables - si vous devez utiliser 'recherche' sur votre lecteur, quelque chose ne va pas avec la gestion de projet)
  7. décompose les codes en modules courts pour la localisation et les codes plus courts, avec moins de défilement, les codes seront plus faciles à tracer.
  8. variables et noms de fonction (le style java semble agréable, par exemple. 'backedupDataForVerification'), ne restez pas pour raccourcir les mots, vous souffrirez plus tard
  9. dans la conception, la re-pense que si vous devez utiliser la fonction de script, ou OO (orienté objet)
  10. ne pas se précipiter sur l'optimisation prématurée, car la vitesse matlab n'est pas le meilleur choix. Si vous le devez vraiment, conservez une version non optimisée pour la comparaison de lisibilité côté à côté, le dépannage et le débogage ne sera pas moins d'une malédiction.
  11. toujours, Toujours, toujours commenter vos codes. N'utilisez jamais l'excuse du manque de temps, vous perdrez plus de temps plus tard.
  12. pour la différenciation, envisagez de définir un nouveau noeud pour les modifications de code, par exemple. ensemble un arbre pour différencier les versions.

  13. utilisez un dossier séparé pour les entrées/ sorties, les images, les résultats intermédiaires, etc.

  14. utilisez timestamp pour tracer vos versions

  15. partagez vos codes avec quelqu'un d'autre, s'ils trouvent qu'il est difficile de maintenir, d'utiliser ou de modifier, repensez sur la façon d'affiner vos constructions.

7
répondu Ursa Major 2011-01-22 17:54:40

je suis d'accord avec la plupart des commentaires sur le fait que Matlab n'est pas très favorable à la structuration du code source des logiciels modernes, mais je ne pense pas qu'il soit trop difficile d'imposer une partie de votre propre structure avec un peu de discipline.

organisez vos fichiers source dans une hiérarchie de répertoires, comme vous le feriez pour les fichiers source de tout programme écrit dans un autre langage de programmation. Vous n'avez pas besoin de vous en tenir à une hiérarchie, choisissez votre propre structure si vous le souhaitez. L'utilisation de la la commande setpath (ou quel que soit son nom) pour dire à Matlab où chercher vos fichiers m lorsque vous travaillez.

familiarisez-vous avec L'outil de profileur Matlab qui peut vous donner des graphiques d'appel (pas tellement graphiquement, plus comme les graphiques d'appel de gprof) qui est une certaine aide dans le déchiffrage du code spaghetti.

bien sûr, tous nos fichiers m sont dans le dépôt et nous les servons à partir de cela. Nous conservons une boîte à outils privée sur l'un de nos réseaux les lecteurs et tous les utilisateurs peuvent appeler le code "libéré" dans cette boîte à outils directement.

3
répondu High Performance Mark 2010-02-24 15:32:29

sauvegarder tout est droit. Créez une boule de goudron vierge de l'arbre des sources d'origine, puis jetez tout dans le contrôle des sources afin que vous puissiez suivre et faire reculer vos changements.

regardez depfun() et depdir () de Matlab, qui détectent les dépendances statiques. Cela pourrait vous aider à voir les dépendances entre les fonctions de Matlab. Avec "depfun-toponly" sur tous les fichiers et une petite chaîne de munging, vous pouvez construire une liste de dépendances immédiates et jeter cela dans un GraphViz fichier pour produire un grand graphe orienté de votre base de code de connexions d'appel. Les groupes dans le graphique pourraient être un bon endroit pour diviser le code autour. (EDIT: Voir Jonas de la solution; ressemble m2html fait pour vous.)

si vous avez beaucoup de latitude pour réécrire le code, envisagez de réécrire une partie du code en tant qu'objets, en utilisant des classes d'utilité apatrides avec des méthodes de classe et des fonctions privées comme moyens d'empaqueter des fonctions connexes ensemble et de fournir une certaine encapsulation. J'ai j'ai travaillé avec des codebases Matlab de grande taille organisées de cette façon, et ça marche très bien. Dans le Matlab classique, les cours sont votre seule façon de faire une sorte de paquets. Je crois que le nouveau système Oo de Matlab a aussi un namespace.

si vous ne voulez pas convertir le code en OO, vous pouvez organiser les fonctions connexes dans les sous-répertoires. Cela aide à l'organiser pour la navigation de code source au moins.

toutes les fonctions devraient avoir un peu de doco dans la norme de Matlab format helptext, y compris une ligne H1. S'ils ne le font pas, collez les commentaires sur ce que vous apprenez là. Ensuite, utilisez l'outil" contentsrpt " pour générer automatiquement des fichiers de table des matières pour les classes ou les répertoires.

bonne chance.

3
répondu Andrew Janke 2010-02-25 14:31:43