matlab - MATLAB 中的常量

标签 matlab constants matlab-class

我获得了一堆 MATLAB 代码的所有权,并注意到代码中散布着一堆“神奇数字”。通常,我喜欢用 C、Ruby、PHP 等语言创建这些常量。在谷歌搜索这个问题时,我发现拥有常量的“官方”方法是定义返回常量值的函数。看起来很笨拙,尤其是因为 MATLAB 在允许每个文件有多个函数时可能会很挑剔。

这真的是最好的选择吗?

我很想使用/制作类似 C 预处理器的东西来为我做这件事。 (我发现一个叫做mpp的东西是别人在类似的困境中做出的,但它看起来被遗弃了。代码无法编译,我不确定它是否能满足我的需求。)

最佳答案

Matlab 现在有常数。 Matlab OOP 的较新 (R2008a+)“classdef”样式允许您定义常量类属性。如果您不需要与旧 Matlab 的后向兼容性,这可能是最佳选择。 (或者,相反,这是放弃向后兼容性的一个很好的理由。)

在类中定义它们。

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

然后使用点限定从任何其他代码中引用它们。

>> disp(MyConstants.SECONDS_PER_HOUR)
        3600

有关所有详细信息,请参阅“用户指南”下“面向对象编程”的 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              

但损害是局部的。如果您想彻底了解,可以通过在函数开头调用 MyConstants() 构造函数来防止它,这会强制 Matlab 将其解析为该范围内的类名。 (恕我直言,这是矫枉过正,但如果你想要它就在那里。)

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

另一个陷阱是 classdef 属性和方法,尤其是像这样的静态方法,速度很慢。在我的机器上,读取这个常量比调用普通函数慢大约 100 倍(22 usec 对比 0.2 usec,参见 this question )。如果您在循环内使用常量,请在进入循环之前将其复制到局部变量。如果出于某种原因您必须使用常量的直接访问,请使用返回值的普通函数。

为了您的理智,请远离预处理器。让它在 Matlab IDE 和调试器(非常有用)中工作需要深入而可怕的黑客攻击。

关于matlab - MATLAB 中的常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1773850/

相关文章:

c++ - 引用和它指向的变量可以有不同的值吗?

ruby-on-rails - 验证模型字段 : if value equals a key in a hash

arrays - 在 MATLAB 中将类数组的元素分配给各个变量时出现问题

matlab - Matlab 使用什么算法来动态调整向量和矩阵的大小?

matlab - 一次将一个数组中的元素添加到另一个数组

c++ - 加速 Matlab 引擎调用

php - 如何在 MySQL 数据库中存储 PHP 常量

matlab - 从 MATLAB 图形对象继承

MATLAB 类 getter 和 setter

matlab - 使用 Matlab 中的方法设置对象属性