2017-10-10 9 views
0

私はpyfftwを使って分割ステップフーリエ変換メソッドを書くのにpythonを使っています。私はほとんど何が起こっているのか理解していると思いますが、私が1つの変数だけで動作しようとすると、変数の多くが変わる理由を理解できません。pyFFTWは予想以上に多くの変数をリンクします

以下のコードでは、1D配列(complex128)、Eから始めて、最初にaに割り当てます。次に、DFTを計画して、時間と周波数の間を行き来する2つの操作を行います。

マイコード:

a = pyfftw.empty_aligned(npts, dtype='complex128') 
b = pyfftw.empty_aligned(npts, dtype='complex128') 

a[:] = pyfftw.interfaces.numpy_fft.fftshift(E); 

fft_object = pyfftw.FFTW(a, b) 
EFT = fft_object() 

ifft_object = pyfftw.FFTW(b, a, direction='FFTW_BACKWARD') 
E = ifft_object() 

A0 = E; 
a[:] = np.power(np.absolute(A0),2) 
IFT = fft_object() 
b[:] = chi*IFT 
Iz = np.power(np.absolute(A0),2) + ifft_object() 
NLfn = A0 * Iz 

問題、私は、コードの後半に入ると、a[:] = np.power(np.absolute(A0),2)を割り当てることA0などaを変えるように思われます。

これはIz = np.power(np.absolute(A0),2) + fft_object()でも発生します。この場合、aまたはbという変数には、一時変数ではなくリンクされているように見えます。

何が起こっているのですか?

答えて

0

Eは、aE is aを確認してください)です。これは、FFTWオブジェクトの2番目の引数がifft_object()のときに返される出力配列であるためです。

その後、EするA0を割り当てるので、あなたはaを変更したとき、彼らは同じオブジェクトなので、絶対に、あなたはまた、A0を変更します。

FFTWオブジェクトを使用する場合は、そのようなことに注意する必要があります。それはコピーを最小限に抑えるように設計されているので、配列を正しいものにするのはあなた次第です。これをしたくない場合は、pyfftw.buildersインターフェイスを使用することをお勧めします。

関連する問題