【问题标题】:Non-scalar enumeration in MatlabMatlab中的非标量枚举
【发布时间】:2018-04-30 13:17:52
【问题描述】:

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

例如,我如何在不使用方法的情况下枚举颜色,使每种颜色都是 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;

【问题讨论】:

    标签: arrays matlab vector colors enumeration


    【解决方案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-by-3 RGB 值数组。例如,你可以说mycolors = [color.red, color.green]; mycolors.toRGB,你会得到[1,0,0;0,1,0]

    希望有帮助!

    【讨论】:

    • 我希望有 color3 解决方案...但是您对我的示例的改进非常感谢!谢谢!
    猜你喜欢
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    相关资源
    最近更新 更多