私は依存するいくつかのプロパティを持つクラスを持っていますが、実際には一度だけ計算したいと思っています。依存プロパティのMATLABレイジー評価
私は、MATLABの依存クラスプロパティで遅延評価を使用することは不可能か、悪い考えであると結論付けました。元の計画は、更新が必要な各(パブリック)プロパティに対してプライベート論理フラグを設定し、コンストラクタにそれをtrueに設定させることでした。次に、プロパティアクセサが呼び出されたときには、そのフラグをチェックして値を計算し、必要に応じて(別のプライベートプロパティに)格納します。フラグがfalseの場合、単にキャッシュされた値のコピーを返します。
私は難しいのは、プロパティアクセサーの制約にあると考えています。つまり、他の無関係のプロパティだけを残していると思います。つまり、get.property(self)メソッドは自己オブジェクトの状態を変更できません。興味深いことに、これは現在のクラスでは黙って失敗します。 (つまり、更新フラグもキャッシュされた計算結果もgetメソッドで設定されないので、毎回高価な計算が実行されます)。
私の疑念は、レイジープロパティをパブリック依存プロパティからパブリックGetAccessを持つメソッドに変更するが、プライベートSetAccessを変更すると疑わしいです。しかし、私はこのように財産条約を偽装する必要はありません。私は、このすべてを私のために行うことができるただの "怠惰な"属性属性があったらいいと思う。
明らかなものがありませんか? MATLABの従属クラスプロパティのアクセサメソッドは、クラスインスタンスの状態を変更することを禁じられていますか?もしそうなら、プライベートな副作用を持つアクセサーには、私が望む振る舞いを得るための最も悪い方法が何であるかを定義していますか?
編集:handle
から継承した後
close all; clear classes; clc
t = LazyTest(3)
t.factorial
for num = 1:10
tic
t.factoriand = num
t.factorial
toc
end
とここ
classdef LazyTest
properties(Access = public)
% num to take factorial of
factoriand
end
properties(Access = public, Dependent)
factorial
end
properties(Access = private)
% logical flag
do_update_factorial
% old result
cached_factorial
end
methods
function self = LazyTest(factoriand)
self.factoriand = factoriand;
self.do_update_factorial = true;
end
end
methods
function result = get.factorial(self)
if self.do_update_factorial
self.cached_factorial = factorial(self.factoriand);
% pretend this is expensive
pause(0.5)
self.do_update_factorial = false
end
result = self.cached_factorial;
end
end
end
...テストクラスの実行には時間が大幅に低下します。
これはやっているようです。 –
私は、余分なプライベートプロパティと比べて、私が気にしているものに対して、isemptyを使用することの混乱を軽減することも好きです。ありがとう。 –
1.明示的なフラグを値に基づく暗黙的なフラグで置き換えることはできません(ここでは、空の値はここでは無効です)。 2. setメソッドが "依存する"プロパティespを更新することは常に適切であるとは限りません。後で計算するのに費用がかかり、2つ以上の他の特性に依存する場合。したがって、一般的なケースでは私はまだ余分なフラグを持っています。 – user1735003