在 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.pi
和constants.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 enumeration
s,那么是的,您只能为每个文件使用单独的文件。
【讨论】:
以上是关于在 Matlab 中的单个文件中定义多个枚举的主要内容,如果未能解决你的问题,请参考以下文章