1

私は数日前に少しMatlabを学び始めました。

forDirac-combのような近似をプロットしたかったので、関数型プログラミングを知っていて、「Matlabでループは必要ない」と言われたので、結局次のようになりました。

M = 50
dx = 0.1
r = 20
x = -r/dx:r/dx
y = arrayfun(@(k) dx .* sum(exp(-2j * pi * dx * k * (-M:dx:M))), x)

しかし、私arrayfunはこれを行うのに良い方法ではないと感じています-Matlabでは厄介/やり過ぎだと感じています。

または多分それは私だけです、私は知りません。
に頼らずにこのグラフをプロットするためのより良い方法はありますarrayfunか、それともこれが最良の方法ですか?

4

1 に答える 1

2

まず、コマンドの後ろにセミコロンを使用して出力を抑制します。これにより、パフォーマンスが大きく異なります。

M  = 50;
dx = 0.1;
r  = 20;
x  = -r/dx : r/dx;

次に、ドット演算子 ( .*./など) は要素単位の操作用です。arrayfun ( dx .* sum(exp(...))) 内で行う乗算は、スカラーにベクトルを掛けたものです。この場合、要素ごとの乗算と通常の乗算​​は同じです。スカラー*ベクトルの通常の乗算​​を維持するのは良い習慣です。バグの防止に役立ちます。

では、arrayfun不要です。次のように同じことを達成できます。

y = dx * sum( exp(-2j*pi*dx * (-M:dx:M).'*x) );

-2j*pi*dxは、すべてのスカラー間の積です。ただし、製品(-M:dx:M).'*xはマトリックス間の製品です。sumデフォルトで列 (次元 1) を合計するため、結果は同じです。このソリューションはメモリ オーバーヘッドが大きくなりますが、 よりもはるかに高速ですarrayfun

.'転置に使用したことに注意してください。Matlab では、この表記A'は共役転置をA.'意味し、通常の転置を意味します。特にあなたのような複雑な数学のコンテキストでは、これは非常に重要です. 違いを学び、よく覚えてください。

于 2012-09-20T04:47:21.157 に答える