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.