3

A是一个带有循环块的块循环矩阵(BCCB 矩阵):

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

那是:

 A = [C1 C2
      C2 C1]

其中每个块 ( C1, C2) 是一个循环矩阵。我读过(见这里)BCCB 可以通过遵循以下等式进行对角化:其中是 2-D 离散傅里叶变换矩阵,是 的共轭,并且是对角矩阵,其条目是 的特征值。A =F*·D·FFF*FDA

在 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是交换的。错误在哪里?

4

1 回答 1

5

你的消息来源有点误导。用 DFT 对 BCCB 矩阵进行对角化的过程如下:

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

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

还要注意(F *称为复共轭转置矩阵)。在 MATLAB 中,它转换为而不是. 巧合的是,DFT 矩阵对称的,这意味着这也是正确的。F* = conj(F)TF'conj(F) FF* = 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

希望这可以为您澄清事情!

于 2013-06-09T16:09:48.270 回答