39 votes

Constantes dans MATLAB

Je suis devenu propriétaire d'un certain nombre de codes MATLAB et j'ai remarqué qu'il y avait un certain nombre de "chiffres magiques" dispersés dans le code. En général, j'aime créer ces constantes dans des langages tels que C, Ruby, PHP, etc. En cherchant ce problème sur Google, j'ai trouvé que la manière "officielle" d'avoir des constantes est de définir des fonctions qui renvoient la valeur constante. Cela semble compliqué, notamment parce que MATLAB peut être pointilleux lorsqu'il autorise plus d'une fonction par fichier.

Est-ce vraiment la meilleure option ?

Je suis tenté d'utiliser / de fabriquer quelque chose comme le préprocesseur C pour faire cela pour moi. (J'ai trouvé que quelque chose appelé mpp a été fait par quelqu'un d'autre dans une situation similaire, mais il semble abandonné. Le code ne compile pas, et je ne suis pas sûr qu'il répondrait à mes besoins).

35voto

Andrew Janke Points 11942

Matlab a des constantes maintenant. La nouvelle version (R2008a+) du style "classdef" de la POO de Matlab vous permet de définir des propriétés de classe constantes. C'est probablement la meilleure option si vous n'avez pas besoin de la rétrocompatibilité avec les anciens Matlab. (Ou, à l'inverse, c'est une bonne raison d'abandonner la rétrocompatibilité).

Définissez-les dans une classe.

classdef MyConstants
    properties (Constant = true)
        SECONDS_PER_HOUR = 60*60;
        DISTANCE_TO_MOON_KM = 384403;
    end
end

Vous pouvez ensuite les référencer à partir de n'importe quel autre code en utilisant le point-qualification.

>> disp(MyConstants.SECONDS_PER_HOUR)
        3600

Pour plus de détails, consultez la documentation Matlab sur la "Programmation orientée objet" dans le "Guide de l'utilisateur".

Il y a quelques petits problèmes. Si le code essaie accidentellement d'écrire dans une constante, au lieu d'obtenir une erreur, il créera une structure locale qui masque la classe des constantes.

>> MyConstants.SECONDS_PER_HOUR
ans =
        3600
>> MyConstants.SECONDS_PER_HOUR = 42
MyConstants = 
    SECONDS_PER_HOUR: 42
>> whos
  Name             Size            Bytes  Class     Attributes

  MyConstants      1x1               132  struct              
  ans              1x1                 8  double              

Mais les dégâts sont locaux. Et si vous voulez être minutieux, vous pouvez vous en protéger en appelant le constructeur MyConstants() au début d'une fonction, ce qui oblige Matlab à l'analyser comme un nom de classe dans cette portée. (IMHO ceci est exagéré, mais c'est là si vous le voulez).

function broken_constant_use
MyConstants(); % "import" to protect assignment
MyConstants.SECONDS_PER_HOUR = 42 % this bug is a syntax error now

L'autre problème est que les propriétés et méthodes classdef, en particulier les statiques comme celle-ci, sont lentes. Sur ma machine, la lecture de cette constante est environ 100x plus lente que l'appel d'une simple fonction (22 usec contre 0.2 usec, voir cette question ). Si vous utilisez une constante dans une boucle, copiez-la dans une variable locale avant d'entrer dans la boucle. Si, pour une raison quelconque, vous devez utiliser l'accès direct aux constantes, optez pour une fonction simple qui renvoie la valeur.

Pour le bien de votre santé mentale, restez à l'écart du préprocesseur. Le faire fonctionner dans l'IDE et le débogueur de Matlab (qui sont très utiles) nécessiterait des bidouillages profonds et terribles.

20voto

Amro Points 72743

En général, je définis simplement une variable en MAJUSCULES et je la place en haut du fichier. Mais vous devez prendre la responsabilité de ne pas changer sa valeur.

Sinon, vous pouvez utiliser les classes MATLAB pour définir des constantes nommées.

8voto

Loren Points 1182

MATLAB ne dispose pas d'un équivalent exact de const. Je recommande de NE PAS utiliser de global pour les constantes - pour une chose, vous devez vous assurer qu'elles sont déclarées partout où vous voulez les utiliser. Je créerais une fonction qui renvoie la ou les valeurs que vous souhaitez. Vous pouvez consulter cet article de blog pour avoir quelques idées.

4voto

mtrw Points 10098

Vous pourriez avoir certaines de ces réponses Comment créer des types énumérés dans MATLAB ? utile. Mais en résumé, il n'existe pas de moyen "en une ligne" de spécifier des variables dont la valeur ne doit pas changer après le paramétrage initial dans MATLAB.

2voto

Quelle que soit la façon dont vous le faites, il s'agira toujours d'un peu de bricolage. Dans des projets antérieurs, mon approche consistait à définir toutes les constantes comme des variables globales dans un fichier script, à invoquer le script au début de l'exécution du programme pour initialiser les variables, et à inclure des déclarations "global MYCONST ;" au début de toute fonction qui devait utiliser MYCONST. La supériorité de cette approche par rapport à la manière "officielle" de définir une fonction qui renvoie une valeur constante est une question d'opinion que l'on peut défendre dans les deux sens. Aucune de ces approches n'est idéale.

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