2

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

%% Example Only
obj2 = tripleAllPoints(obj1)
    obj.pts = obj.pts * 3;
    obj2 = obj1
end

然后我尝试在不使用输出对象的情况下实现变异器......但是,在 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
4

2 回答 2

4

Matlab 有两种类型的类:handle 和 value

值类是按值传递的,因此无论何时写入它都必须被复制。此外,方法调用必须采用格式obj = method(obj);才能使更改“坚持”。

相反,句柄对象是通过引用传递的,因此,每当您在任何工作区(基础工作区或函数的工作区)中修改对象时,对象都会随处更改。因此,调用工作区中的调用method(obj);也会发生变化obj,即使obj没有显式返回。

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

classdef myslice < handle

即你正在继承句柄类。

于 2010-05-17T00:19:56.530 回答
1

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

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

(另见:http: //blogs.mathworks.com/loren/2007/03/22/in-place-operations-on-data/

于 2011-09-07T21:18:42.027 回答