我希望使用枚举来访问数组或字典的元素,但没有运气。
枚举:
classdef Enumeration1 < uint32
enumeration
Left (1);
Right (2);
Neither (3);
end
end
用法:
directions(Enumeration1.Left) = 7;
对我而言,这应与
相同directions(1) = 7;
但我得到'下标索引必须是真正的正整数或逻辑'。
或者当我使用containers.Map
对象时,我看到的所有示例都将键作为字符串。当我使用枚举时,我得到'指定的密钥类型与此容器的预期类型不匹配'。我可以从help containers.Map
看到uint32是一个可接受的密钥类型。
如何使用枚举值有效地索引对象?
答案 0 :(得分:3)
如果您查看http://www.mathworks.com/help/matlab/matlab_oop/enumerations.html中给出的示例,您会看到Enumeration1.Left
的值不是值1
,而是一个对象。您可以通过检查返回的对象来确认这一点:
a = Enumeration1.Left;
whos a
display(a)
这表明a
是类Enumeration1
的对象,其大小为108 bytes
,值为Left
。将Left
转换为1
已完成
b = uint32(a);
所以以下内容应该有效:
directions(uint32(Enumeration1.Left)) = 7;
有趣的是 - 当我使用Matlab 2012a时,我实际上可以使用上面的语法,并且Matlab不会抱怨。
答案 1 :(得分:2)
一般来说,use objects as indices为您的班级定义subsindex
方法。
请注意,对于MATLAB中的所有其他内容,subsindex
必须返回从零开始的索引。
classdef E < uint32
enumeration
Left (1);
Right (2);
Neither (3);
end
methods
function ind = subsindex(obj)
ind = uint32(obj) - 1;
end
end
end
示例:
>> x = 1:10;
>> x(E.Right)
ans =
2
请注意,即使没有定义subsindex
方法,从内置类型继承的类也应该像往常一样作为索引(至少它在我的R2013a版本中以这种方式工作)。
如果要使用containers.Map,则必须将枚举显式转换为uint32
。我认为containers.Map/subsref
方法不使用isa
来测试索引术语的类型,而是使用类似strcmp(class(obj),'..')
的内容来解释错误消息:
Error using containers.Map/subsref
Specified key type does not match the type expected for this container.