Matlab中的非标量枚举

时间:2017-11-16 21:16:14

标签: arrays matlab vector colors enumeration

是否可以使枚举成员为非标量?

例如,如何在不使用方法的情况下枚举颜色,使每种颜色为1x3双(根据情节需要)?

使用以下类定义

classdef color
    properties
        R, G, B
    end
    methods
        function c = color(r, g, b)
            c.R = r;
            c.G = g;
            c.B = b;
        end
        function g = get(c)
            g = [c.R, c.G, c.B];
        end
    end
    enumeration
        red (1, 0, 0)
        green (0, 1, 0)
    end
end

我可以写color.green.get()来获取[0 1 0],但我希望color.green能够使代码更清晰。

另一种解决方案可能是将color设置为全局结构,但它不实用,因为全局变量会导致混淆,我必须在每个脚本/函数中编写global color;

1 个答案:

答案 0 :(得分:1)

我不确定你在这里问的是什么,但我认为主要的答案是你现在做的基本上是正确的事情(虽然我建议一些小的变化)。

您当然可以拥有枚举值的非标量数组 - 例如,您可以使用您的类创建mycolors = [color.red, color.green]。您还可以使用非标量属性进行枚举,例如:

classdef color2
    properties
        RGB
    end
    methods
        function c = color2(r, g, b)
            c.RGB = [r,g,b];
        end
    end
    enumeration
        red (1, 0, 0)
        green (0, 1, 0)
    end
end

然后你可以说color2.red.RGB并且你得到[1,0,0]

但我猜这些都不是你想要的。我想象你想要的东西,不幸的是你明确地不能做的事情,就像这样:

classdef color3 < double
    enumeration
        red ([1,0,0])
        green ([0,1,0])
    end
end

然后您只需输入color3.red,即可获得[1,0,0]。你不能这样做,因为当枚举从内置继承时,它必须是一个标量。

就我个人而言,我基本上会做你正在做的事情,但不是打电话给你的方法get我会称之为toRGB,所以你要说color.red.toRGB ,这感觉很自然(特别是如果你也给它一些其他方法,如toHSVtoHex)。我也稍微修改它,以便它可以接受颜色数组:

function rgb = toRGB(c)
        rgb = [[c.R]', [c.G]', [c.B]'];
end

通过这种方式,您可以传入n颜色数组,并输出n - 3个RGB值数组。例如,您可以说mycolors = [color.red, color.green]; mycolors.toRGB,然后获得[1,0,0;0,1,0]

希望有所帮助!