Matlab 中的非标量枚举

Non-scalar enumeration in Matlab

是否可以有非标量的枚举成员?

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

具有以下class定义

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 设置为全局结构,但这不切实际,因为全局变量会导致混淆,我必须在每个 script/function 中写 global color;

我不确定你在这里问的到底是什么,但我认为主要的答案是你目前做的基本上是正确的(尽管我建议做一些小的改变)。

您当然可以拥有枚举值的非标量数组 - 例如,使用您的 class,您可以创建 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].

希望对您有所帮助!