让A
是具有循环 block 的 block 循环矩阵(即 BCCB 矩阵):
A = [1 2 3 4
2 1 4 3
3 4 1 2
4 3 2 1]
即:
A = [C1 C2
C2 C1]
其中每个 block (C1
,C2
)是一个circulant matrix .我读过(参见 here)BCCB 可以通过以下等式对角化:A =F<sup>*</sup>·D·F
其中 F
是二维离散傅立叶变换矩阵,F<sup>*</sup>
是 F
的共轭, 和 D
是一个对角矩阵,其元素是 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
的第二列和第四列被切换。哪里出错了?
最佳答案
您的来源有点误导。用 DFT 对 BCCB 矩阵进行对角化,如下所示:
A = (F<sub>M</sub>⊗F<sub>N</sub>)<sup>*</sup>D(F<sub>M</sub>⊗F<sub>N</sub>)
其中 FN 是 N 点 DFT 矩阵,M 是 Cj block 的数量,N 是每个单独 block 的大小(在您的示例中 M =2 且 N=2)。 “⊗”符号表示 tensor product .
另请注意 F<sup>*</sup> = conj(F)<sup>T</sup>
(F* 称为 complex conjugate transpose 矩阵)。在 MATLAB 中,它转换为 F'
而不是 conj(F)
.巧合的是,DFT matrix F
是symmetric ,这意味着 F<sup>*</sup> = 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
对角化 A
仅使用二维 FFT 运算,您可以改为这样做:
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
.
希望这能为您澄清一切!
关于matlab - 用循环 block 对 block 循环矩阵进行对角化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17007587/