我使用 pyculib 在 Anaconda 3.5 中对矩阵执行 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)
最后,结果是False。而且orig和result的区别不是一个小数字,不可忽略。我尝试了一些其他数据集(不是随机数),并得到了一些错误的结果。
另外,我在没有逆 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结果是对的。
谁能帮忙指出原因?