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
,这感觉很自然(特别是如果你还给它一些其他方法,如 toHSV
或 toHex
)。我也会稍微修改它,以便它可以接受颜色数组:
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]
.
希望对您有所帮助!
是否可以有非标量的枚举成员?
例如,如何在不使用方法的情况下枚举颜色,使每种颜色都是 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
,这感觉很自然(特别是如果你还给它一些其他方法,如 toHSV
或 toHex
)。我也会稍微修改它,以便它可以接受颜色数组:
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]
.
希望对您有所帮助!