让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
)是circulant matrix。我已经阅读(参见here)BCCB可以通过以下等式进行对角化:A =F*·D·F
其中F
是二维离散傅立叶变换矩阵,F*
是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
的第二列和第四列。错误在哪里?
答案 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 F
为symmetric,这意味着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
。
希望这能为你澄清事情!