在 Matlab 中的单个文件中定义多个枚举

Posted

技术标签:

【中文标题】在 Matlab 中的单个文件中定义多个枚举【英文标题】:Define Multiple Enums in a Single File in Matlab 【发布时间】:2021-09-06 13:26:14 【问题描述】:

是否可以在单个 Matlab 文件中定义多个枚举?或者是否可以像我们在文件末尾定义本地函数一样拥有“本地”枚举?

我正在做一个项目,如果有多个枚举类会很方便,但是每次都使用classdef 很烦人,因为它需要一个单独的文件,这意味着有很多短文件它的唯一目的是定义枚举。目前,每个枚举如下所示:

classdef exampleEnumType < uint32
    
    enumeration
        zero(0),
        one(1),
        two(2),
    end

end

有没有办法在 Matlab 中紧凑地定义枚举,这样我就不需要为每个枚举单独的文件(使用 Matlab 2021a)?

【问题讨论】:

你需要这些谜团做什么? MATLAB 不进行类型检查,它们只是常量。您可以轻松定义常量,而无需将它们作为枚举。 @CrisLuengo 它主要用于许多具有不同可能设置的用户使用的脚本。将设置存储在枚举中可以让您在阅读代码时更容易理解。 也许只是一些categorical 变量在这里是一个好方法?对于您想要的每个不同的“枚举”,粘贴一个 categorical 数组,将所有有效值保存在一个类中的 Constant 属性中。这些“枚举”究竟将如何使用? 【参考方案1】:

首先,有很多短文件是 MATLAB 的正常情况。解决这个问题是可能的,但通常是徒劳的。

传统上,在 MATLAB 中,常量值被定义为一个函数。例如,pi 是一个函数。它看起来像这样:

function v = pi
   v = 3.14159

通过将常量变成一个函数,它可以在任何地方使用,而无需首先运行代码来定义这些常量。

枚举只不过是一系列常量。结构体也可以做到这一点:

exampleEnumType = struct('zero',0, 'one',1, 'two',2);

从最近(R2019b)开始,MATLAB 允许dot indexing into the output of a function call,但您确实需要在函数调用中使用空括号。因此,我们可以像使用常量一样声明上述结构:

function v = exampleEnumType
   v = struct('zero',0, 'one',1, 'two',2);

这允许exampleEnumType().zero(几乎)像使用枚举或结构变量一样。

那么我们如何将其扩展到在单个文件中定义多个这些?如果公共前缀没有问题,我们可以定义一个带有静态成员函数的类,每个函数声明一个常量:

classdef constants
   methods(Static)
       function v = pi
          v = 3.14159
       end
       function v = exampleEnumType
          v = struct('zero',0, 'one',1, 'two',2);
       end
   end
end

我们现在有constants.piconstants.exampleEnumType().zero

或者,创建一个返回更复杂结构的函数,如下所示:

function v = constants
   v.pi = 3.14159;
   v.exampleEnumType = struct('zero',0, 'one',1, 'two',2);

这允许我们做constants().exampleEnumType.zero

请注意,上述方法不适用于 R2019b 之前的 MATLAB 版本。对于旧版本的 MATLAB,最后一种方法(函数constants)是最好的方法。用户只需要在需要使用常量的任何函数的顶部执行constants = constants;。这会使用同名变量隐藏函数,以便 constants.exampleEnumType.zero 按预期工作。

【讨论】:

感谢您的意见和建议,有一点是exampleEnumType.zero不行,但是需要调用exampleEnumType().zero(见第一点下uk.mathworks.com/help/matlab/matlab_prog/… Supported Syntaxes) 玩了一会儿,我上面的观点只适用于独立函数,而不适用于类的方法。 @fishlein 有趣的是,我没有注意到这个警告。将更新答案。很遗憾,因为一般情况下调用函数不需要使用空括号。【参考方案2】:

您可以使用地图...

exampleEnum = containers.Map( 'zero','one','two', 0,1,2 );

用法看起来像

exampleEnum('zero') % = 0

【讨论】:

【参考方案3】:

我想你可能想在这里使用categorical 数组,并将它们的有效值的“枚举”作为常量粘贴到一个公共类中。

classdef Constants

    properties (Constant)
        
        Foods = categorical(["apple", "banana", "pear"])

        SupportedProtocols = categorical("http", "https", "ftp")

        SpeedOfGravityMps = 9.86

    end

end

如果您希望它们是真正的 Matlab enumerations,那么是的,您只能为每个文件使用单独的文件。

【讨论】:

以上是关于在 Matlab 中的单个文件中定义多个枚举的主要内容,如果未能解决你的问题,请参考以下文章

如何访问数组并将其存储在python中的单个数组中(类似于matlab中的单元格)

C++ 中的全局枚举

syms在matlab中的作用

matlab switch case中的java枚举

如何在MATLAB中读入多个音频文件啊?

视图中的 MVC 5 枚举 - 隐藏单个元素