Constantes dans MATLAB
Je suis venu dans la propriété d'un tas de code MATLAB et ont remarqué un tas de "nombres magiques" dispersés sur le code. Généralement, j'aime faire de ces constantes dans des langages tels que le C, Ruby, PHP, etc. Lors de Googler ce problème, j'ai trouvé que le "officielle" de la manière d'avoir des constantes est de définir des fonctions qui retournent la valeur de la constante. Semble kludgey, en particulier parce que MATLAB peut être capricieux quand en permettant à plus d'une fonction par fichier.
Est-ce vraiment la meilleure option?
Je suis tenté d'utiliser /de faire quelque chose comme le Préprocesseur C de le faire pour moi. (J'ai trouvé que quelque chose appelé mpp
a été faite par quelqu'un d'autre dans une situation identique, mais il semble abandonné. Le code ne compile pas, et je ne sais pas si elle serait répondre à mes besoins.)
Vous devez vous connecter pour publier un commentaire.
J'ai l'habitude de simplement définir une variable avec UPPER_CASE et de le placer à proximité du haut du fichier. Mais vous devez prendre la responsabilité de ne pas changer sa valeur.
Sinon, vous pouvez utilisation de MATLAB classes de définir nommé constantes.
Matlab possède des constantes maintenant. La plus récente (R2008a+) "classdef" style de Matlab programmation orientée objet permet de définir la constante des propriétés de la classe. C'est probablement la meilleure option si vous n'avez pas besoin de back-compatibilité avec les vieux Matlabs. (Ou, à l'inverse, est une bonne raison pour abandonner l'arrière-compatibilité.)
Les définir dans une classe.
Ensuite de référence à partir d'un autre code à l'aide de dot-qualification.
Voir la documentation Matlab pour la "Programmation Orientée Objet" de la section "Guide de l'Utilisateur" pour tous les détails.
Il ya un couple mineurs de pièges. Si le code accidentellement essaie d'écrire à une constante, au lieu de se faire une erreur, il va créer un local struct que les masques de la classe des constantes.
Mais les dégâts sont locales. Et si vous voulez être approfondie, vous pouvez vous protéger contre elle par l'appel de la MyConstants() constructeur au début d'une fonction de forces de Matlab pour l'analyser comme un nom de classe dans ce champ d'application. (À mon humble avis c'est exagéré, mais il est là si vous voulez.)
L'autre, gotcha est que classdef des propriétés et des méthodes, en particulier la statique comme cela, sont lents. Sur ma machine, la lecture de cette constante est environ 100 fois plus lent que l'appel d'une plaine de fonction (22 usec contre 0,2 µs, voir cette question). Si vous utilisez une constante à l'intérieur d'une boucle, le copier sur une variable locale avant d'entrer dans la boucle. Si pour une raison quelconque, vous devez utiliser l'accès direct de constantes, d'aller avec une simple fonction qui retourne la valeur.
Pour le bien de votre santé mentale, rester à l'écart de la préprocesseur choses. Obtenir que le travail à l'intérieur de l'Matlab IDE et débogueur (qui sont très utiles) aurait besoin profond et terrible hacks.
MATLAB n'est pas exacte const équivalent. Je recommande de ne PAS utiliser mondiale pour les constantes - pour une chose, vous devez vous assurer qu'ils sont déclarés partout où vous voulez les utiliser. Je voudrais créer une fonction qui retourne la valeur(s) que vous souhaitez. Vous pouvez consulter ce blog pour quelques idées.
Vous pourriez certaines de ces réponses Comment puis-je créer des types énumérés dans MATLAB? utile. Mais en bref, non, il n'est pas un "on-line" manière de spécifier des variables dont la valeur ne devrait pas changer après le réglage initial dans MATLAB.
Quelque manière que vous le faites, il sera encore un peu de bidouille. Dans les projets passés, mon approche a été de définir toutes les constantes comme des variables globales dans un fichier de script, appeler le script au début de l'exécution du programme pour initialiser les variables, et d'inclure "global MYCONST;" les déclarations au début de toute fonction nécessaire à l'utilisation de MYCONST. De savoir si ou non de cette approche est supérieure à la "officielle" de la manière de définir une fonction pour renvoyer une valeur constante est une question d'opinion que l'on pourrait dire de toute façon. Aucune de ces manières est idéal.
Ma façon de traiter avec des constantes que je veux passer à d'autres fonctions est d'utiliser une structure (struct):
Il n'est pas aussi propre que C fichiers d'en-tête, mais il fait le travail et évite MATLAB globals. Si vous vouliez que les constantes de tous définis dans un fichier séparé (par exemple, getConstants.m), qui serait aussi facile:
Ne pas appeler à une constante à l'aide de
myClass.myconst
sans la création d'une instance de la première! À moins que la vitesse n'est pas un problème. J'étais sous l'impression que le premier appel à une propriété de la constante de créer une instance et ensuite tous les futurs appels de référence de l'instance, (Propriétés avec des Valeurs Constantes), mais je ne crois plus que ce soit le cas. J'ai créé un très de base de la fonction de test de la forme:Avec les classes définies comme:
ou:
ou:
Pour les différents cas d'objets, manipuler les objets, les objets imbriqués etc (ainsi que des opérations d'affectation). Notez que ce sont tous des scalaires; je n'ai pas enquêter sur des tableaux, des cellules ou des caractères. Pour N = 1 000 000 de mes résultats (pour le total du temps écoulé) étaient les suivantes:
J'ai également créé une classe Java et a couru un test similaire:
La surcharge dans l'appel de l'objet Java est élevé, mais à l'intérieur de l'objet, simple d'accès et d'attribuer des opérations arriver aussi rapide que régulier de matlab objets. Si vous voulez comportement de référence pour le démarrage, Java peut être le chemin à parcourir. Je n'ai pas étudier l'objet d'appels à l'intérieur de fonctions imbriquées, mais j'ai vu des choses étranges. Aussi, le profileur est des ordures quand il vient à beaucoup de ce genre de choses, c'est pourquoi je suis passé à la sauvegarde manuelle de la fois.
Pour référence, la classe Java utilisée:
Sur une note connexe, voici un lien vers un tableau de NIST constantes: table ascii et une fonction matlab qui renvoie une structure avec ceux listés valeurs: Matlab FileExchange
J'utilise un script avec de simples constantes dans les capitales et inclure le script dans d'autres scripts tr=cet été eux.
Je n'ai pas l'esprit à propos de ceux-ci étant pas constante. Si j'écris "de GAUCHE=3", puis je wupold être simplement stupide et il n'y a pas de remède contre la bêtise de toute façon, donc je ne dérange pas.
Mais je déteste le fait que cette méthode encombre mon espace de travail avec des variables que je n'aurais jamais à inspecter. Et je n'aime pas non plus utiliser sothing comme "tourner(MyConstants.GAUCHE)" parce que cela rend plus relevés, comme un tas de caractères, ce qui fait de mon code unreadible.
Ce que j'aurais besoin n'est pas une variable, mais une possibilité d'avoir une véritable pré-compilateur constantes. Qui est. les chaînes sont remplacés par des valeurs juste avant d'exécuter le code. C'est la façon dont il devrait être. Un constante doit pas être une variable. Il n'est là que pour rendre votre code plus readible et maintenable. MathWorks: s'il vous PLAÎT, VEUILLEZ, s'il vous PLAÎT. Il ne peut pas être si difficile que ça à mettre en œuvre. . .