Oop 如何在Matlab中创建有效的实例变量变异器?
以前,我实现了如下的mutators,但是它在我正在研究的递归OO算法上运行得非常慢,我怀疑这可能是因为我在每次函数调用中都复制了对象。。。这是正确的吗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
%% 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
另见: