oop - 如何在 Matlab 中创建高效的实例变量更改器(mutator)?

标签 oop matlab this getter-setter

以前,我按如下方式实现了更改器(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/

相关文章:

python - 构建应用程序 : Is it bad form to have an app create directories on users computer for program file storage?

c++ - 设计模式 - Adapter 和 Bridge 之间的区别?

performance - 更快地连接不同大小的元胞数组

javascript - 如何在回调中访问正确的“this”?

javascript - 如何在 jQuery 中通过 "this"引用 JavaScript 类?

java - 父类(super class)公共(public)方法实现

python - 从类变量元素构造实例变量 pyparsing 匹配器

c - 我们如何将结构从 C 代码传递到 Matlab 代码

matlab - 线条霍夫变换

javascript - 使用 setState 时 React this 未定义