是否可以使用枚举作为MATLAB向量或Map的下标?

时间:2013-08-22 16:26:47

标签: matlab oop enumeration subscript

我希望使用枚举来访问数组或字典的元素,但没有运气。

枚举:

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是一个可接受的密钥类型。

如何使用枚举值有效地索引对象?

2 个答案:

答案 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.