2

以前は、ミューテーターを次のように実装しましたが、作業中の再帰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 には、ハンドルと値の 2 種類のクラスがあります。

値クラスは値によって渡されるため、書き込むたびにコピーする必要があります。また、メソッド呼び出しはobj = method(obj);、変更を「固定」するための形式である必要があります。

対照的に、ハンドル オブジェクトは参照によって渡されるため、任意のワークスペース (ベース ワークスペースまたは関数のワークスペース) でオブジェクトを変更すると、オブジェクトはどこでも変更されます。したがって、呼び出しは、明示的に返されなくても、呼び出し元のワークスペースでもmethod(obj);変更されます。objobj

デフォルトのクラスは値オブジェクトです。ハンドル オブジェクトを使用する場合は、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 に答える