0

このようなMatlabの関数ハンドルがあります

fhandle = @(A) max(1-2*A,0).*(2*A.^5+2*A + 1)

通常A、 は行列です。これを何度も実行すると、計算が遅くなります。関数ハンドルとして保持することは可能ですが (コードを書き直す必要はありません)、2*A一度だけ計算してから 3 回適用することはできますか?

前もって感謝します。

4

1 に答える 1

6

2*Aまず、1つの小さな問題です。3回計算していません。あなたはそれを2回計算し、1回計算して2*A.^5います。累乗演算子は乗算演算子よりも優先されることに注意してください。として分割することもでき(2*A).*A.^4ますが、多くの作業を節約できない可能性があります。

あなたは無名関数内の単一の式に制限されているので2*A、この場合に事前計算するために私が考えることができる特にクリーンで効率的な方法はありません。代わりに、乗算係数を括弧の外に移動して、実行する乗算の​​量を減らすことができます。次のように方程式を書き直すことができます。

fhandle = @(A) 4.*max(0.5 - A,0).*(A.^5 + A + 0.5);

MAX1-2*Aを使用する操作は、のすべての負の要素をゼロに設定するだけなので、2の因数を操作の外に移動しても影響を受けないことに注意してください。方程式の各部分から2の因数を削除すると、結果に4の1の因数が乗算され、実行する要素ごとの乗算の数が半分になります。

コードを書き直したくないと言っていても、効率が重要な場合は、無名関数の代わりに関数またはサブ関数の使用を検討することをお勧めします。OOPタイミングに関する質問に対するこの回答に示されている結果に基づくと、無名関数の方がオーバーヘッドが大きい可能性があります。そして、そのような短い関数の場合、それを書き直すことはそれほど多くの作業ではありません。

于 2011-05-23T14:51:18.063 に答える