저는 pyculib를 사용하여 Anaconda 3.5의 매트릭스에서 3D FFT를 수행합니다. 방금 웹 사이트에 게시 된 the example code을 따랐습니다. 그러나 나는 재미있는 것을 발견했고 그 이유를 이해하지 못합니다.pyculib를 사용한 3D FFT 결과가 잘못되었습니다.
행렬을 만들 때 numpy.arange
을 사용할 때만 pyculib 행렬에서 3D FFT를 수행하는 것이 정확합니다.
from pyculib.fft.binding import Plan, CUFFT_C2C
import numpy as np
from numba import cuda
data = np.random.rand(26, 256, 256).astype(np.complex64)
orig = data.copy()
d_data = cuda.to_device(data)
fftplan = Plan.three(CUFFT_C2C, *data.shape)
fftplan.forward(d_data, d_data)
fftplan.inverse(d_data, d_data)
d_data.copy_to_host(data)
result = data/n
np.allclose(orig, result.real)
마지막으로,거짓으로 판명 : 여기
는 코드입니다. 그리고 orig 및 결과가의 차이는 무시할 수있는 작은 숫자가 아닙니다. 다른 데이터 세트 (임의의 숫자가 아님)를 시도하고 잘못된 결과가 표시됩니다.또한, 나는 역 FFT없이 테스트 :
from pyculib.fft.binding import Plan, CUFFT_C2C
import numpy as np
from numba import cuda
from scipy.fftpack import fftn,ifftn
data = np.random.rand(26,256,256).astype(np.complex64)
orig = data.copy()
orig_fft = fftn(orig)
d_data = cuda.to_device(data)
fftplan = Plan.three(CUFFT_C2C, *data.shape)
fftplan.forward(d_data, d_data)
d_data.copy_to_host(data)
np.allclose(orig_fft, data)
결과는 잘못된 것입니다.
웹 사이트의 테스트 코드는 numpy.arange
을 사용하여 매트릭스를 만듭니다. 그리고 나는 시도했다 :
n = 26*256*256
data = np.arange(n, dtype=np.complex64).reshape(26,256,256)
그리고이 매트릭스의 FFT 결과가 맞다.
아무도 이유를 지적하는 데 도움이 될 수 있습니까?
동의합니다. 일부 수치상의 문제 일 수 있습니다. 흥미로운 점은 오늘도 FFTW3을 사용해 보았습니다. 똑같은 일을했습니다. 그리고 pyfftw와 numpy.fft는 numpy.rand 입력과 동일합니다. 내가 커프스에 뭔가 잘못했는지 궁금합니다. – billinair