【问题标题】:Decomposition of 3D FFT using 1D FFT in dimension z在 z 维中使用 1D FFT 分解 3D FFT
【发布时间】:2018-04-27 09:37:52
【问题描述】:

我有一个 3D 矩阵:

A = [5 7 8; 0 1 9; 4 3 6];
A(:,:,2) = [1 0 4; 3 5 6; 9 8 7]

我想使用 1D FFT 分解在此矩阵中应用 3D FFT。我读到我应该在每个维度上应用一维 FFT。

我该怎么做?

对于 x 和 y,我这样做:

for k=0:2
    y1 = A(:,k+1,:);
    A(:,k+1,:) = fft(y1);
end

for k=0:2
    y2 = A(k+1,:,:);
    A(k+1,:,:) = fft(y2);
end

对于z维度,我不知道该怎么做。

【问题讨论】:

    标签: matlab fft


    【解决方案1】:

    fft 函数接受第三个输入指定维度,并相对于其他维度进行矢量化。所以你可以简单地使用:

    result = fft(fft(fft(A, [], 1), [], 2), [], 3);
    

    【讨论】:

    • 感谢您的回复,您的方法可以帮助我,但我想在 x 和 y 和 z 中使用 boucle。我如何在 z 中做到这一点?
    • @kais:什么是“毛圈”?你是说循环吗?
    • 是的,我的意思是循环。我也想在 z diemnsion 中使用与其他 x 和 y 相同的循环来执行 fft。请帮助我
    【解决方案2】:

    首先,您的循环应该如下所示:

    for k=1:size(A,2)
        y = A(:,k,:);
        A(:,k,:) = fft(y);
    end
    

    第二,上面的循环与(正如@Luis Mendo 在他的回答中所说):

    A = fft(A,[],2);
    

    根本不需要写循环。

    第三,要沿第三维计算一维 FFT,您可以使用:

    fft(A,[],3);
    

    可以把它写成一个循环(只是为了回答你明确的问题,我不建议你这样做):

    for k=1:size(A,3)
        y = A(:,:,k);
        A(:,:,k) = fft(y);
    end
    

    如果由于某种原因,由于 y 的形状,这在您的 MATLAB 版本中不起作用,您可以将 y 重新整形为列向量:

    ... fft(y(:));
    

    最后,要使用 1D 分解计算 3D FFT,您可以简单地编写

    A = fftn(A);
    

    这与您尝试实施的过程完全相同,只是它执行得更快。

    【讨论】:

    • 非常感谢。请您知道如何将 3D FFT 并行化到 p 进程中
    • MATLAB 使用所有可支配的内核。如果您的计算机上有多个内核,则它们都将与 fftfft3 一起用于多维数组(但可能不会与 fft 应用于向量`,因为那是更难并行化)。
    猜你喜欢
    • 1970-01-01
    • 2012-07-05
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多