【问题标题】:MATLAB: Array of structure initialization in CLASS propertiesMATLAB:类属性中的结构初始化数组
【发布时间】:2014-08-26 09:27:03
【问题描述】:

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

classdef myClass < handle

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

end

我希望如何编写我的结构数组(我觉得它更干净易读):

classdef myClass < handle

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

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

end

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

谢谢

【问题讨论】:

  • 我是否更正了您在创建 myClass 类型的对象时遇到以下错误:Error using myClass | Error: File: myClass.m Line: 5 Column: 18 | Unbalanced or unexpected parenthesis or bracket. 使用我的 Matlab R2011b 我无法在属性中创建带有点语法的结构,例如myProp.Name = 'A' 导致相同的语法错误。点可能与对象访问混淆了。

标签: arrays matlab oop struct


【解决方案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

【讨论】:

    【解决方案2】:

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

    myClass 中的属性myProp 似乎代表着别的东西。为简单起见,我假设它是一个人(您需要调整示例以满足您的需求)。您可以创建一个具有Name、Value、ParentName 属性的Person 类并在您的类中使用它。 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 类会始终确保它们保持正确的顺序,提供 setter 和 getter 等。

    第一个解决方案的 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
    

    【讨论】:

    • 我尝试了上述拥有 Person 类的方法,但是一旦我在 myClass 属性中定义了属性 myProp(1),我就会收到一条错误消息:“Parse error at '(' : Usage may是无效的 MATLAB 语法。
    • @Spooferman 不看代码很难知道。您很可能犯了语法错误。这些错误由 mlint 标记为红色。我上面描述的只是解决问题的一种想法(对象组合),但您必须根据需要调整代码。
    • 在我看来,使用像@gire 说的(聚合)这样的属性对象数组来实现对象会更优雅。
    【解决方案3】:

    你原来设置myProp的方式没有问题。

    但是,如果您只关心可读性,您可以添加一个名为 makeMyProp 之类的私有静态方法,它可以按照您想要的方式布置,它会返回一个填充的结构 myProp。

    然后,在properties 部分,说myProp = myClass.makeMyProp;。

    【讨论】:

      【解决方案4】:
      classdef myClass < handle
      
          properties(Constant)
                myProp1a = struct('Name','A','Value',1);
                myProp1b = struct('Name','B','Value',2);
                myProp1 = [myClass.myProp1a, myClass.myProp1b];
          end
      
      end
      

      【讨论】:

      【解决方案5】:

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

      一个示例用法是:

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

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

      【讨论】:

      • 这实际上并没有解决我的问题。第二个字段(在我上面的示例中)也可以是一个字符串。此外,我们可以有多个字段。像名称、值、ParentName 等
      猜你喜欢
      • 2019-02-19
      • 1970-01-01
      • 1970-01-01
      • 2020-03-05
      • 1970-01-01
      • 2013-08-07
      • 1970-01-01
      • 2012-05-02
      • 2015-07-29
      相关资源
      最近更新 更多