如何将 C++ 数组复制到特征张量中

问题描述 投票:0回答:1

我有一个代码,它采用特征张量的 3D FFT 并返回特征张量输出。我正在使用 C++ 数组将其传递给 FFTW 计划,但是我在获取正确输出时遇到问题(即大小已关闭)。有没有更好的方法使用 Eigen::map 而不是 for 循环将“output_array”的内容复制到 Eigen 张量中?

代码示例:

主要代码

static const int nx = 4;
static const int ny = 4;
static const int nz = 4;
void r2cfft3d(Eigen::Tensor<double, 3>& rArr, Eigen::Tensor<std::complex<double>, 3>& cArr){    
       
        fftw_complex *input_array;
        input_array = (fftw_complex*) fftw_malloc(nx*ny*nz * sizeof(fftw_complex));
        memcpy(input_array, rArr.data(), nx*ny*nz * sizeof(fftw_complex));

        fftw_complex *output_array;
        output_array = (fftw_complex*) fftw_malloc(nx*ny*nz * sizeof(fftw_complex));
        
        fftw_plan forward = fftw_plan_dft_3d(nx, ny, nz, input_array, output_array, FFTW_FORWARD, FFTW_ESTIMATE);
        
        fftw_execute(forward);
        fftw_destroy_plan(forward);
        fftw_cleanup();

        for(int i=0; i < nx; ++i){
            for(int j=0; j < ny; ++j) {
                for(int k=0; k < nz; ++k) {
                    cArr(i,j,k).real(output_array[i + nz * (j + ny * k)][REAL]);
                    cArr(i,j,k).imag(output_array[i + nz * (j + ny * k)][IMAG]);
                
                }

            }
        }
        
        fftw_free(input_array);
        fftw_free(output_array);
    }

这将返回以下内容:

     1e+11        1e+11        1e+11        1e+11        1e+11        1e+11        1e+11        1e+11 -9.53674e-07 -9.53674e-07 -9.53674e-07  2.86102e-06            0            0            0            0
       1e+11        1e+11        1e+11        1e+11        1e+11        5e+11        1e+11        1e+11 -4.76837e-06 -4.76837e-06 -4.76837e-06 -1.62125e-05 -1.52588e-05 -1.52588e-05 -1.52588e-05 -1.52588e-05
       1e+11        1e+11        1e+11        1e+11        1e+11        1e+11        1e+11        1e+11 -9.53674e-07 -9.53674e-07 -9.53674e-07  2.86102e-06            0            0            0            0
       1e+11        1e+11        1e+11        1e+11        1e+11        1e+11        1e+11        1e+11 -8.58307e-06 -8.58307e-06 -8.58307e-06 -4.76837e-06 -7.62939e-06 -7.62939e-06 -7.62939e-06 -7.62939e-06

虽然正确答案是

1e+11 1e+11 1e+11 1e+11 1e+11 1e+11 1e+11 1e+11 1e+11 1e+11 1e+11 1e+11 1e+11 1e+11 1e+11 1e+11
1e+11 1e+11 1e+11 1e+11 1e+11 1e+11 1e+11 1e+11 1e+11 1e+11 1e+11 1e+11 1e+11 1e+11 1e+11 1e+11
1e+11 1e+11 1e+11 1e+11 1e+11 1e+11 1e+11 1e+11 1e+11 1e+11 5e+11 1e+11 1e+11 1e+11 1e+11 1e+11
1e+11 1e+11 1e+11 1e+11 1e+11 1e+11 1e+11 1e+11 1e+11 1e+11 1e+11 1e+11 1e+11 1e+11 1e+11 1e+11

似乎某些列由于某种原因被零填充并且行和列也关闭(即 5e11 的位置)

有没有办法在这里使用这样的东西而不是 for 循环:

TensorMap<Eigen::Tensor<std::complex<double>, 3>> test(output_array, nx,ny,nz);
c++ tensorflow eigen eigen3
1个回答
0
投票

实际上我可以通过使用

memcpy
来解决这个问题。因此,我添加了以下行,而不是 for 循环:

memcpy(cArr.data(),output_array, nx*ny*nz * sizeof(fftw_complex));
© www.soinside.com 2019 - 2024. All rights reserved.