以前,我按如下方式实现了更改器(mutator),但是它在我正在研究的递归面向对象算法上运行得非常慢,我怀疑这可能是因为我在每个函数调用上复制对象......这是正确的吗?
%% Example Only
obj2 = tripleAllPoints(obj1)
obj.pts = obj.pts * 3;
obj2 = obj1
end
然后,我尝试在不使用输出对象的情况下实现更改器(mutator)...但是,在 MATLAB 中我似乎无法执行此操作 - 由于范围问题,更改不会“坚持”?
%% Example Only
tripleAllPoints(obj1)
obj1.pts = obj1.pts * 3;
end
出于应用目的,下面是我的代码的极其简化的版本(使用面向对象和递归)。
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 有两种类型的类:handle and value 。
值类是按值传递的,因此每当写入时都必须复制它。此外,方法调用必须采用 obj = method(obj);
的形式,以便更改为“stick”。
相反,句柄对象是通过引用传递的,因此,每当您在任何工作区(基础工作区或函数的工作区)中修改对象时,该对象都会在各处发生更改。因此,调用 method(obj);
也会更改调用工作区中的 obj
,即使未显式返回 obj
。
默认类是值对象。如果您想使用句柄对象,您的 classdef
行必须是:
classdef myslice < handle
即您正在对句柄类进行子类化。
关于oop - 如何在 Matlab 中创建高效的实例变量更改器(mutator)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2840309/