Matlab对象实例更新

时间:2013-05-17 11:01:15

标签: matlab object struct

问题描述

我正在尝试构建类分析的对象,其中可变数量的子类 Resset 存储为Analysis属性 ressets中的结构(参见下面的Matlab代码)。 classdef 分析有一个名为 addResset 的方法,用于构建 Resset 的新实例,并将此实例设置为属性 ressets 。但是,当我创建一个实例时,让我们说一个Analysis类,我使用A.addResset添加一个Resset对象,该方法不会自动更新实例A中的属性ressets:

>> A = Analysis('some_name');

>> A.addResset('some_res');

>> A

 A =

 Properties: 
     name: 'some_name'
  ressets: []
stepTypes: []

 Methods

Analysis     addResset

相反,我必须写:

>> A = A.addResset('some_res')  

Properties:
     name: 'some_name'
  ressets: [1x1 struct]
stepTypes: []

当我用其方法调用 A 时,为什么Matlab不更新实例 A ?只要Analysis类是' flat ',这不是一个大问题。但是,在我的(实际)情况下,每个Resset类也将具有Data类(即另一个嵌套级别)。目前,我生成一个空的Analysis实例,添加一些Resset类,向每个单独的Resset类添加Data类,然后我必须将每个父对象更新到顶层(即Analysis)。它使我的剧本过长而且凌乱。

我对Matlab的面向对象编程部分比较陌生。我在addResset方法的定义中做错了什么?在python中,一个实例似乎在方法中引用时会自动更新,我希望Matlab具有类似的功能吗?

Matlab代码

Matlab版本:7.13.0.564(R2011b 32bits)

classdef Analysis

properties
    name
    ressets          %structure of Resset objects
    stepTypes
end

methods 
    function obj = Analysis(name)
        % ANALYSIS contructs an analysis object
        if nargin > 0
            obj.name = name;
        end
    end
end

methods
    function [obj resset valid_fieldname] = addResset(obj,name)
        %create a new Resset class instance(PackageName.ClassName)
        resset = xrf_read.Resset(name);
        %replace 'possible' dots in name (=invalid fieldname)
        valid_fieldname = regexprep(name,'\.','_');
        %add Resset instance to ressets property
        obj.ressets.(valid_fieldname) = resset;
    end
end

end    

为简单起见,Resset类看起来像

classdef Resset

properties
    name
    datas
end

methods
    function obj = Resset(name)
        % RESSET constructs a resset object
        if nargin > 0
            obj.name = name;
        end
    end
end

end

1 个答案:

答案 0 :(得分:3)

简短:使你的类成为句柄的子类。

这些旧样式类遵循“写入时复制”原则,这意味着它们不会更改原始实例。