如何在Matlab类中定义常量?

时间:2018-06-27 18:13:28

标签: matlab class enums

我想创建一个Matlab枚举类,其方法是根据每个枚举的对应数值从表中查找值。这就是我所拥有的:

classdef testclass < uint8
    enumeration
        enum1 (1)
        enum2 (2)
        enum3 (3)
    end

    A = [100 200 300;101 202 303;111 222 333];

    methods
        function retval = getval(obj1,obj2)
            retval = testclass.A(obj1,obj2);
        end
    end
end

到目前为止,我已经尝试过:

  • 不继承uint8的属性,而向类中添加properties块,其矩阵A为常数,而矩阵B为常数。每个枚举对应的数字。我收到一个错误消息,说第一个枚举(大概也是每个枚举)在其定义中有太多参数。

  • 上面的代码。我在包含A的行上收到一条错误消息,说这是一个意外的MATLAB表达式。

  • 不要从uint8继承属性并添加两个properties块,因为如果我定义两个属性,Matlab会为每个枚举定义期望两个参数。第一个properties块是Constant,第二个块在“ properties”之后没有任何内容。这也不起作用。

  • getval函数内部定义矩阵A。这可行,但是我希望A可供类中的其他方法使用。

如何定义该类中每个方法可用的变量?

3 个答案:

答案 0 :(得分:0)

我发现您的代码存在三个问题。

  1. 我不知道这是否重要,具体取决于您在A中的值,但是您不能使用uint8表示超过255的数字;例如300、303、333。因此您需要在A矩阵中使用uint16或更小的值。
  2. 我不太明白为什么要使用obj1和obj2作为输入。如果需要两个参数,我的解决方案将需要修改。
  3. 您的类和构造方法应该具有相同的名称。

我想这就是你所追求的:

>> en = getval.enum1
>> en.a
ans = 
   1x3 uint16 row vector
   101 202 303
>> en.a*2
ans = 
   1x3 uint16 row vector
   202 404 606

classdef getval
    enumeration
        enum1 (1)
        enum2 (2)
        enum3 (3)
    end
    properties
        a
    end

    methods
        function retval = getval(a)            
            A = uint16([100 200 300;101 202 303;111 222 333]);
            retval.a = A(a,:);
        end
    end
end

答案 1 :(得分:0)

或者,

>> en = getval.enum1
>> en.A
ans = 
   1x3 uint16 row vector
   101 202 303
>> en.A*2
ans = 
   1x3 uint16 row vector
   202 404 606

classdef getval
    enumeration
        enum1 (100,200,300)
        enum2 (101,202,303)
        enum3 (111,222,333)
    end
    properties
        A
    end
    methods
        function retval = getval(a,b,c)            
            retval.A = uint16([a,b,c]);
        end
    end
end

答案 2 :(得分:0)

不幸的是,您无法在继承的枚举类上定义属性。您可以改为在枚举类上定义一个函数(例如“ double”),该函数将返回一些基础值。然后,您可以使用此值引用常量。请参见以下示例:

班级:

classdef testclass
    enumeration
        enum1
        enum2
        enum3
    end
    properties(Constant)
        A = [100 200 300;101 202 303;111 222 333];
    end
    methods
        function retval = getval(obj1,obj2)
            retval = testclass.A(double(obj1),double(obj2));
        end
        function retval = double(obj)
            if obj == testclass.enum1
                retval = 1;
            elseif obj == testclass.enum2
                retval = 2;
            elseif obj == testclass.enum3
                retval = 3;
            end
        end
    end
end

运行:

A = testclass.enum1
B = testclass.enum2
getval(A,B)