Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ fftwpp在卷积后创建零填充数组_C++_Fft_Fftw - Fatal编程技术网

C++ fftwpp在卷积后创建零填充数组

C++ fftwpp在卷积后创建零填充数组,c++,fft,fftw,C++,Fft,Fftw,我使用fftwpp将我的数据和卷积核都转换成傅里叶空间,像在标量积中一样将它们相乘,然后将它们转换回实空间。当我第一次运行程序时,它创建了一个完全由零填充的数组。当我再次运行它时,它会给我期望的结果 运行它时,会创建一个wisdom3.txt。如果我删除它,程序将花费大量时间再次创建零填充数组 我的代码有什么问题 // sx, sy and sz are the dimensions of my data int szp = sz / 2 + 1; size_t align = sizeof(

我使用fftwpp将我的数据和卷积核都转换成傅里叶空间,像在标量积中一样将它们相乘,然后将它们转换回实空间。当我第一次运行程序时,它创建了一个完全由零填充的数组。当我再次运行它时,它会给我期望的结果

运行它时,会创建一个
wisdom3.txt
。如果我删除它,程序将花费大量时间再次创建零填充数组

我的代码有什么问题

// sx, sy and sz are the dimensions of my data

int szp = sz / 2 + 1;
size_t align = sizeof(Complex);

// creates arrays to store the data in, the double one is for the real data
// the Complex one for the fourier data
array3<double> f(sx, sy, sz, align);
array3<Complex> g(sx, sy, szp, align);

// copying data into double array
for(int k = 0; k < sz; k++)
    for(int j = 0; j < sy; j++)
        for(int i = 0; i < sx; i++)
            f(i, j, k) = data[i + sx * j + sx * sy * k];

// transforming data into fourier space
rcfft3d Forward3(sz, f, g);
Forward3.fft(f, g);


// generate the kernel
array3<double> kernel(sx, sy, sz);
array3<Complex> kernel2(sx, sy, szp, align);
// more code to create the kernel left out ...


// transform the kernel into the fourier space
rcfft3d ForwardKernel3(sz, kernel, kernel2);
ForwardKernel3.fft(kernel, kernel2);


// multiplying data and kernel in fourier space together
for(int k = 0; k < szp; k++)
    for(int j = 0; j < sy; j++)
        for(int i = 0; i < sx; i++)
            g(i, j, k) = g(i, j, k) * kernel2(i, j, k);


// transform back to normal space
crfft3d Backward3(sz, g, f);
Backward3.fftNormalized(g, f);


// putting everything in the results array and normalize
for(int k = 0; k < sz; k++)
    for(int j = 0; j < sy; j++)
        for(int i = 0; i < sx; i++)
            result[i + sx * j + sx * sy * k] =
                (f(i, j, k) >= thresholdValue ? f(i, j, k) : 0);
//sx、sy和sz是我的数据的维度
int szp=sz/2+1;
尺寸对齐=尺寸(复杂);
//创建用于存储数据的数组,双数组用于实际数据
//傅里叶数据的复数形式
阵列3f(sx,sy,sz,align);
阵列3g(sx、sy、szp、align);
//将数据复制到双数组中
对于(int k=0;k=阈值?f(i,j,k):0;

FFTW++是FFTW上的包装器。FFTW需要生成一个执行计划来高效地处理数据。一旦生成计划,就可以处理各种数据集。您看到的文件是关于程序第一次运行时生成的计划的信息。一旦它存在,它将在连续运行时加载,并允许您的程序快速运行。如果您删除它,FFTW必须重新生成它,使您的程序再次运行缓慢

至于为什么第一次运行时输出为零,是因为这个计划生成步骤。这一点在本文中进行了解释


总之,由于我没有使用FFTW++,我不知道在执行FT之前应该调用什么样的方法来确保生成计划。但是,在定义输入/输出数组之后,在使用数据初始化它们之前,应该立即调用它。如果您需要多次运行代码,您应该保留WITHIST文件。

谢谢,我刚刚在声明数组之后移动了转换声明,它现在可以在第一次运行时正常工作。