让A与循环块(块循环矩阵即一个BCCB矩阵):
A = [1 2 3 4
2 1 4 3
3 4 1 2
4 3 2 1]
Run Code Online (Sandbox Code Playgroud)
那是:
A = [C1 C2
C2 C1]
Run Code Online (Sandbox Code Playgroud)
其中每个块(C1,C2)是循环矩阵.我已经读过(见这里)BCCB可以通过以下等式对角化:其中是2-D离散傅立叶变换矩阵,是共轭的,并且是对角矩阵,其条目是特征值.A =F*·D·FFF*FDA
在MATLAB中我使用以下代码:
(conj(dftmtx(4))/16*(fft2(A))*dftmtx(4))
Run Code Online (Sandbox Code Playgroud)
但结果是:
[1 4 3 2
2 3 4 1
3 2 1 4
4 1 2 3]
Run Code Online (Sandbox Code Playgroud)
这里A切换了第二列和第四列.错误在哪里?
你的来源有点误导.使用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
Run Code Online (Sandbox Code Playgroud)
产量:
D =
10 0 0 0
0 -2 0 0
0 0 -4 0
0 0 0 0
Run Code Online (Sandbox Code Playgroud)
要A仅使用2-D FFT运算进行对角化,您可以这样做:
c = reshape(A(:, 1), N, []); %// First column of each block
X = fft2(c);
D = diag(X(:));
Run Code Online (Sandbox Code Playgroud)
或者在单行中:
D = diag(reshape(fft2(reshape(A(:, 1), N, [])), [], 1));
Run Code Online (Sandbox Code Playgroud)
所有这些都产生相同的对角矩阵D.
希望这能为您澄清一切!