Ben*_*kes 39 matlab constants matlab-class
我已经掌握了一堆MATLAB代码的所有权,并注意到代码中散布着一堆"神奇的数字".通常,我喜欢用C,Ruby,PHP等语言制作这些常量.当谷歌搜索这个问题时,我发现拥有常量的"官方"方式是定义返回常量值的函数.看起来像kludgey,特别是因为当每个文件允许多个函数时,MATLAB可能很挑剔.
这真的是最好的选择吗?
我很想使用/制作像C预处理器这样的东西来为我做这件事.(我发现所谓的某些东西mpp是由处于类似困境的其他人制作的,但它看起来已经废弃.代码无法编译,我不确定它是否能满足我的需求.)
And*_*nke 35
Matlab现在有常量.Matlab OOP的较新(R2008a +)"classdef"样式允许您定义常量类属性.如果您不需要与旧Matlabs的后兼容性,这可能是最佳选择.(或者,相反,是放弃反向兼容性的一个很好的理由.)
在课堂上定义它们.
classdef MyConstants
properties (Constant = true)
SECONDS_PER_HOUR = 60*60;
DISTANCE_TO_MOON_KM = 384403;
end
end
Run Code Online (Sandbox Code Playgroud)
然后使用点限定从任何其他代码引用它们.
>> disp(MyConstants.SECONDS_PER_HOUR)
3600
Run Code Online (Sandbox Code Playgroud)
有关所有详细信息,请参阅"用户指南"下的"面向对象编程"的Matlab文档.
有一些小问题.如果代码意外地尝试写入常量而不是出错,它将创建一个掩盖常量类的本地结构.
>> 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
Run Code Online (Sandbox Code Playgroud)
但损害是局部的.如果你想要彻底,你可以通过在函数的开头调用MyConstants()构造函数来防止它,这迫使Matlab将其解析为该范围中的类名.(恕我直言,这是矫枉过正,但如果你想要的话就在那里.)
function broken_constant_use
MyConstants(); % "import" to protect assignment
MyConstants.SECONDS_PER_HOUR = 42 % this bug is a syntax error now
Run Code Online (Sandbox Code Playgroud)
另一个问题是classdef属性和方法,特别是像这样的静态,很慢.在我的机器上,读取此常量比调用普通函数慢约100倍(22 usec vs. 0.2 usec,请参阅此问题).如果在循环内使用常量,则在进入循环之前将其复制到局部变量.如果由于某种原因必须使用常量的直接访问,请使用返回值的普通函数.
为了您的理智,远离预处理器的东西.让它在Matlab IDE和调试器(非常有用)中工作将需要深刻而可怕的黑客攻击.