在维z中使用1D FFT分解3D FFT

时间:2018-04-27 09:37:53

标签: matlab fft

我有一个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。我读到它应该在每个维度上应用1D 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,我不知道如何做到这一点。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

Dim foundData as Boolean
Set tables = ie.document.getElementsByTagName("Table")
For x = 0 to tables.Length Step 1
    'You may need to use innerText or inner/outerHTML to find the text
    If tables(x).innerText Like "*TEXT IN TABLE*" Then
        'Table found, Copy the Data
        Set Clipboard = New MSForms.DataObject
        Clipboard.SetText tables(x).outerHTML
        Clipboard.PutInClipboard
        Worksheets("temp").Cells(1, 1).PasteSpecial
        foundData = True
        Exit For 'Exit Loop since the data was found
    End If
Next x
'Check if data was found after leaving the loop
If foundData <> True Then
    MsgBox "The Data Was Not Found on Any Tables"
End If

第二次,上面的循环是相同的(如@Luis Mendo在他的回答中所说):

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

根本不需要编写循环。

第三,要计算沿第三维的1D FFT,您可以使用:

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

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

fft(A,[],3);

如果出于某种原因,由于for k=1:size(A,3) y = A(:,:,k); A(:,:,k) = fft(y); end 的形状,在您的MATLAB版本中不起作用,您可以将y重新塑造为列向量:

y

最后,要使用1D分解计算3D FFT,您只需编写

... fft(y(:));

这遵循您尝试实施的完全相同的过程,但它的速度要快得多。