8

ルジャンドル多項式を n 次まで数値的に使用するコードを作成しました。例えば:

....
case 8 
p = (6435*x.^8-12012*x.^6+6930*x.^4-1260*x.^2+35)/128; return
case 9 
...

ベクトルxが長い場合、これは遅くなる可能性があります。x.^4sayとsay の間にパフォーマンスの違いがあることがわかりx.*x.*x.*x、これを使用してコードを改善できると考えました。私はそれを使用timeitして見つけました:

x=linspace(0,10,1e6);
f1= @() power(x,4)
f2= @() x.4;
f3= @() x.^2.^2
f4= @() x.*x.*x.*x

f4他のものよりも2 倍高速です。ただし、私が行くと、との間にほとんど違いはありません (他のすべてのオプションは遅くなります)。x.^6(x.*x.*x).^2x.*x.*x.*x.*x.*x

ベクトルのべき乗を取得する最も効率的な方法を教えてください。パフォーマンスに大きな違いがある理由を説明できますか?

4

3 に答える 3

8

これはあなたの質問に対する正確な答えではありませんが、問題を解決するかもしれません:

x2 = x.*x; % or x.^2 or power(x,2), whichever is most efficient
p = ((((6435*x2-12012)*x2+6930)*x2-1260)*x2+35)/128

この方法では、累乗を 1 回だけ行い、指数 2 のみを使用します。このトリックは、すべてのルジャンドル多項式に適用できます (奇数次多項式では、1x2が に置き換えられxます)。

于 2013-09-24T23:48:26.890 に答える
1

ここにいくつかの考えがあります:

power(x,4)x.^4同等です(ドキュメントを読んでください)。

x.*x.*x.*xおそらく次のようなものに最適化されていますx.^2.^2


x.^2.^2はおそらく次のように評価されます。

x.^4はおそらく次のように直接評価されます: 各要素の 4 乗を取る (遅い)。

2 回の高速操作が 1 回の低速操作よりも時間がかからないことは、それほど奇妙ではありません。4 乗の場合に最適化が実行されないのは残念ですが、常に機能するとは限らず、コストがかかる場合もあります (入力チェック、メモリ?)。


タイミングについて: 実際には、ファクター 2 よりもはるかに多くの違いがあります。

関数でそれらを呼び出すと、それぞれの場合に関数のオーバーヘッドが追加され、相対的な違いが小さくなります。

y=x;tic,power(x,4);toc
y=x;tic,x.^4;toc
y=x;tic,x.^2.^2;toc
y=x;tic,x.*x.*x.*x;toc

あげる:

Elapsed time is 0.034826 seconds.
Elapsed time is 0.029186 seconds.
Elapsed time is 0.003891 seconds.
Elapsed time is 0.003840 seconds.

つまり、ほぼ 10 倍の違いです。ただし、秒単位の時間差はまだ小さいことに注意してください。そのため、ほとんどの実用的なアプリケーションでは単純な構文を使用します。

于 2013-09-25T14:21:21.587 に答える