4

その中にプロパティを持つクラスがあります(クラスファイルの名前がinputvar.

これを 2 つの異なる関数の入力引数として使用します。これらの関数の計算はまったく同じですが、コードが少し異なります。これについては後で説明します。

最初の関数 (名前は myfun1 としましょう) では、入力引数を次のように記述しました。

f = myfun1 (inputvar)

したがって、関数内でクラスの変数を使用するたびに、、、などを呼び出す必要がありinputvar.var1ますinputvar.var2

2 番目の関数 (myfun2) では、クラスの各変数を入力引数に書き込んだので、次のようになります。

f = myfun2 (inputvar.var1, inputvar.var2, ... etc )

関数内では、クラスの名前を含めずに、、、などvar1を使用するだけです。var2

両方の関数を実行した後、 はmyfun2よりもはるかに高速でmyfun1、約 60% 実行されることがわかりました (tic-toc を使用しました)。

誰かが私にそれがなぜなのか正確に説明できますか?

4

2 に答える 2

3

参照で:

MATLAB は、一般に "copy-on-write" と呼ばれるシステムを使用して、入力引数を変更するまで、または変更しない限り、関数ワークスペース内で入力引数のコピーを作成しないようにします。入力引数を変更しない場合、MATLAB はコピーの作成を回避します。たとえば、このコードでは:

function y = functionOfLargeMatrix(x) y = x(1); 関数内で x が変更されていないため、MATLAB は functionOfLargeMatrix のワークスペースに入力のコピーを作成しません。一方、この関数を呼び出した場合:

関数 y = functionOfLargeMatrix2(x) x(2) = 2; y = x(1); x は functionOfLargeMatrix2 のワークスペース内で変更されているため、コピーを作成する必要があります。

上記のステートメントによると、クラス オブジェクトを直接渡し、このオブジェクトのメンバーを変更すると、クラス全体のコピー操作が適用されます。

一方、クラス メンバーを個別の引数として指定すると、関数内で変更された関連メンバーのみにコピー操作が適用されるため、実行が高速になります。

于 2013-07-29T19:45:13.157 に答える