MATLAB与C++(Eigen)中3D数组各维度1D FFT实现疑问及对比
3D张量沿第三维度的1D FFT:MATLAB含义与Eigen实现
问题说明
我在做MATLAB和C++(Eigen库)的3D张量1D FFT处理,已经搞定了沿第1、2维度的FFT,但对MATLAB里uh3 = fft(u,[],3)的具体逻辑和对应的Eigen实现摸不清。
我的MATLAB代码里,生成的3D张量u尺寸是(Nz+1)行 × Nx列 × Ny个矩阵,其中:
fft(u,[],1)是沿每一列做1D FFTfft(u,[],2)是沿每一行做1D FFT
这两个操作已经用Eigen实现了,但fft(u,[],3)到底做了什么,怎么用Eigen写对应代码,一直没搞明白。
MATLAB中fft(u,[],3)的逻辑
fft(u,[],3)的本质是对3D张量里每个(i,j)位置的第三维度向量(也就是u(i,j,:))单独做1D FFT,完全等价于手动写嵌套循环遍历所有行和列,对每个位置的第三维度切片执行FFT:
numRows=Nz+1;numCols=Nx; for i= 1:numRows for j= 1:numCols uk(i,j,:) = fft(u(i,j,:)); end end
说白了就是固定行号i和列号j,把第三维度(对应MATLAB里"矩阵数量"的那个维度)上的所有元素拿出来当一个1D数组,做FFT,输出的张量尺寸和原张量完全一样。
Eigen C++的对应实现
针对Eigen定义的3D张量uFun((nz+1),nx,ny)(维度顺序:行(z)、列(x)、第三维度(y)),要实现和fft(u,[],3)相同的功能,核心就是遍历每个(z,x)位置,提取该位置上的第三维度(y方向)向量,做FFT后写回结果:
static const int nx = 8; static const int ny = 4; static const int nz = 6; // 假设uFun已经初始化完成,fft是配置好的EigenFFT对象 Eigen::Tensor<std::complex<double>, 3> uh3(nz+1, nx, ny); uh3.setZero(); // 遍历所有行(z)和列(x) for (int z = 0; z < nz+1; ++z) { for (int x = 0; x < nx; ++x) { // 提取当前(z,x)位置的第三维度向量 Eigen::VectorXd input_vec(ny); for (int y = 0; y < ny; ++y) { input_vec(y) = uFun(z, x, y); } // 执行1D FFT Eigen::VectorXcd fft_result = fft.fwd(input_vec); // 将结果写回张量对应位置 for (int y = 0; y < ny; ++y) { uh3(z, x, y) = fft_result(y); } } }
补充说明
- 上面的写法逻辑和MATLAB的等价循环完全对应,非常直观,适合理解逻辑。
- 如果想优化效率,可以利用Eigen的
slice函数直接提取第三维度的向量,避免手动循环拷贝,但核心逻辑不变。
内容的提问来源于stack exchange,提问作者Mathew77
相关产品推荐
相关产品推荐

