MATLAB:CLASS属性中的结构初始化数组

时间:2014-08-26 09:27:03

标签: arrays matlab oop struct

我想创建一个存储包含所需值的属性的文件。 每个属性都必须定义为struct数组。 我当前的struct初始化数组方式:

classdef myClass < handle

    properties(Constant)
          myProp1  = struct(...
                     'Name', {'A','B'},...
                     'Value', {'1','2'});
    end

end

我希望如何编写我的struct数组(我觉得它更干净和可读):

classdef myClass < handle

    properties(Constant)
          myProp1(1).Name = 'A';
          myProp1(1).Value = 1;

          myProp1(2).Name = 'B';
          myProp1(2).Value = 2;
    end

end

我应该如何实现这一目标?

由于

5 个答案:

答案 0 :(得分:1)

我认为不可能像你提议的那样在属性定义中创建结构。 (见我对你的问题的评论)。另一种方法是在构造函数中创建结构数组。使用(SetAccess=private),以便不会从外部更改属性。

% myClass.m
classdef myClass < handle
    properties(SetAccess=private)
        myProp1 = struct
    end
    methods
        function obj = myClass() % constructor
            obj.myProp1(1).Name = 'A';
            obj.myProp1(1).Value = 1;
            obj.myProp1(2).Name = 'B';
            obj.myProp1(2).Value = 2;
        end
    end
end

答案 1 :(得分:0)

您可以使用object composition解决此问题。

似乎myProp中的属性myClass代表了其他内容。为简单起见,我将假设它是一个人(您需要调整示例以满足您的需求)。您可以使用属性PersonNameValue创建一个ParentName类,并在您的课程中使用它。 myClass中的属性部分如下所示:

myProp(1) = Person(name1, value1, parent_name1);
myProp(2) = Person(name2, value2, parent_name2);
...
myProp(N) = Person(nameN, valueN, parent_nameN);

或者,您可以准备Person类以接受数组作为输入:

names        = {name1,  name2,  ..., nameN};
values       = [value1, value2, ..., valueN];
parent_names = {pname1, pname2, ..., pnameN};

... %//possibly more code here

myProp = Person(names, values, parent_names);

并且班级Person将始终保持正确的顺序,提供制定者和吸气剂等。

第一个解决方案的Person类的存根看起来像这样(接受数组的类会更长):

classdef Person < handle
    properties (Access = private)
        name        = '';
        value       = 0;
        parent_name = '';
    end
    methods (Access = public)
        function this = Person(name, value, parent_name)
            this.SetName(name);
            this.SetValue(value);
            this.SetParentName(parent_name);
        end
        function SetName(this, name)
            this.name = name;
        end
        function SetValue(this, value)
            this.value = value;
        end
        function SetParentName(this, parent_name)
            this.parent_name = parent_name;
        end
    end
end

答案 2 :(得分:0)

您设置myProp的原始方式没有任何问题。

但是,如果你只关心可读性,可以添加一个名为makeMyProp的私有静态方法,它可以按照你想要的方式布局,它返回一个填充的结构{{ 1}}。

然后,在myProp部分中,说properties

答案 3 :(得分:0)

classdef myClass < handle

    properties(Constant)
          myProp1a = struct('Name','A','Value',1);
          myProp1b = struct('Name','B','Value',2);
          myProp1 = [myClass.myProp1a, myClass.myProp1b];
    end

end

答案 4 :(得分:-1)

你可以使用enumeration(是的,这显然存在于MATLAB中)。

示例用法是:

classdef ExampleEnum < uint8 %// Can also be another datatype
    enumeration
    %//  name  value
          A     (1)
          B     (2)
    end    
end

然后MATLAB会根据您使用枚举对象的方式自动使用字符串或值(文档中提到了这一点)。