Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 如何在Matlab中创建有效的实例变量变异器?_Oop_Matlab_This_Getter Setter - Fatal编程技术网

Oop 如何在Matlab中创建有效的实例变量变异器?

Oop 如何在Matlab中创建有效的实例变量变异器?,oop,matlab,this,getter-setter,Oop,Matlab,This,Getter Setter,以前,我实现了如下的mutators,但是它在我正在研究的递归OO算法上运行得非常慢,我怀疑这可能是因为我在每次函数调用中都复制了对象。。。这是正确的吗 %% Example Only obj2 = tripleAllPoints(obj1) obj.pts = obj.pts * 3; obj2 = obj1 end 然后我尝试在不使用输出对象的情况下实现mutators。。。然而,在MATLAB中,我似乎无法做到这一点——因为范围问题,更改不会持续 %% Example O

以前,我实现了如下的mutators,但是它在我正在研究的递归OO算法上运行得非常慢,我怀疑这可能是因为我在每次函数调用中都复制了对象。。。这是正确的吗

%% Example Only
obj2 = tripleAllPoints(obj1)
    obj.pts = obj.pts * 3;
    obj2 = obj1
end
然后我尝试在不使用输出对象的情况下实现mutators。。。然而,在MATLAB中,我似乎无法做到这一点——因为范围问题,更改不会持续

%% Example Only
tripleAllPoints(obj1)
    obj1.pts = obj1.pts * 3;
end
出于应用目的,下面是我的代码的一个极其简化的版本,它使用OO和递归

classdef myslice

properties
    pts     % array of pts
    nROW % number of rows
    nDIM % number of dimensions
    subs    % sub-slices
end % end properties

methods
    function calcSubs(obj)
        obj.subs = cell(1,obj.nROW);
        for i=1:obj.nROW
            obj.subs{i} = myslice;
            obj.subs{i}.pts = obj.pts(1:i,2:end);
        end
    end

    function vol = calcVol(obj)
      if obj.nROW == 1
         obj.volume = prod(obj.pts);
      else
         obj.volume = 0;
         calcSubs(obj);
         for i=1:obj.nROW
                obj.volume = obj.volume + calcVol(obj.subs{i});
         end
      end
    end

end % end methods

end % end classdef

Matlab有两种类型的类:

值类是按值传递的,因此每当您向其写入时都必须复制它。此外,方法调用的形式必须为obj=methodobj;以便更改为“粘滞”

相反,句柄对象是通过引用传递的,因此,无论何时修改任何工作区(基本工作区或函数的工作区)中的对象,对象都会到处更改。因此,调用methodobj;也会更改调用工作区中的obj,即使obj没有显式返回

默认类是值对象。如果要使用句柄对象,classdef行必须是:

classdef myslice < handle

i、 e.您正在对handle类进行子类化。

在这种情况下,您可以通过使用与输入相同的输出名称,向MATLAB提供关于发生了什么的额外提示。在您的示例中,这样可以避免创建obj的副本。例如,如果您需要obj.pts的旧值和新值来更新某些其他属性,则这可能并不总是合适的

%% Example Only
obj = tripleAllPoints(obj)
    obj.pts = obj.pts * 3;
end
另见: