MATLAB中的常量

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和调试器(非常有用)中工作将需要深刻而可怕的黑客攻击.

  • 我喜欢*使用在新版本的Matlab中引入的OOP内容,但是在我们的测试中,它会让事情变得缓慢**.(从嵌套函数更改为OOP时,运行*simple*函数100,000次从0.0837秒变为2.3689秒.)我们编写的大部分内容都需要相当优化,因此开销很大. (4认同)

Amr*_*mro 20

我通常只使用UPPER_CASE定义一个变量并放在文件顶部附近.但你必须负责任地不改变它的价值.

否则,您可以使用MATLAB类来定义命名常量.

  • 我通常使用MATLAB类来保存所有可配置参数.这也使您能够轻松创建多个配置并进行交换.您甚至可以创建一系列配置并遍历数组,依次在每个配置上运行测试代码. (6认同)

小智 8

MATLAB没有精确的const等价物.我建议不要使用global作为常量 - 首先,你需要确保它们在你想要使用它们的任何地方声明.我会创建一个返回所需值的函数.您可以查看此博客文章以获取一些想法.