You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 FFT
  • fft(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 20:14:51