1

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

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

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

end

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

4

3 回答 3

1

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

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

function v = pi
   v = 3.14159

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

枚举只不过是一系列常量。同样可以用结构来完成:

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

从最近 (R2019b) 开始,MATLAB 允许对函数调用的输出进行点索引,但您确实需要在函数调用中使用空括号。因此,我们可以像使用常量一样声明上述结构:

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可以按预期工作。

于 2021-09-07T14:56:00.687 回答
0

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

classdef Constants

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

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

        SpeedOfGravityMps = 9.86

    end

end

如果您希望它们成为真正的 Matlab enumerations,那么是的,您将被每个文件都困在一个单独的文件中。

于 2021-09-18T15:52:52.703 回答
0

你可以用地图...

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

用法看起来像

exampleEnum('zero') % = 0
于 2021-09-07T08:45:06.710 回答