具有循环块的块循环矩阵的对角化

时间:2013-06-09 07:55:14

标签: matlab matrix fft

A成为具有循环块的块循环矩阵( BCCB矩阵):

A = [1 2 3 4
     2 1 4 3
     3 4 1 2
     4 3 2 1]

即:

 A = [C1 C2
      C2 C1]

其中每个块(C1C2)是circulant matrix。我已经阅读(参见here)BCCB可以通过以下等式进行对角化:A =F*·D·F其中F是二维离散傅立叶变换矩阵,F*FD的共轭是一个对角矩阵,其条目是A的特征值。

在MATLAB中,我使用以下代码:

(conj(dftmtx(4))/16*(fft2(A))*dftmtx(4))

但结果是:

[1 4 3 2
 2 3 4 1
 3 2 1 4
 4 1 2 3]

此处切换A的第二列和第四列。错误在哪里?

1 个答案:

答案 0 :(得分:5)

您的来源有点误导。使用DFT对BCCB矩阵进行对角化如下:

  

A = (FM⊗FN)*D(FM⊗FN)

其中F N 是N点DFT矩阵,M是C j 块的数量,N是每个块的大小(在您的示例中为M) = 2且N = 2)。 “⊗”符号表示tensor product

另请注意F* = conj(F)T(F * 称为complex conjugate transpose矩阵)。在MATLAB中,它转换为F'而不是conj(F)。巧合的是,DFT matrix Fsymmetric,这意味着F* = conj(F)也是如此。

我不确定你要计算什么,但是这里是A的对角化在MATLAB中是如何完成的:

M = 2; N = 2;
FF = kron(dftmtx(M), dftmtx(N)); %// Tensor product
D = FF' * A * FF / size(A, 1);   %// ' is the conjugate transpose operator

产生:

D =
    10    0    0    0
     0   -2    0    0
     0    0   -4    0
     0    0    0    0

要仅使用2-D FFT操作对A进行对角化,您可以改为:

c = reshape(A(:, 1), N, []);     %// First column of each block
X = fft2(c);
D = diag(X(:));  

或单行:

D = diag(reshape(fft2(reshape(A(:, 1), N, [])), [], 1));

所有这些都产生相同的对角矩阵D

希望这能为你澄清事情!