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

no_*_*ame 3 matlab fft matrix

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切换了第二列和第四列.错误在哪里?

Eit*_*n T 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
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.

希望这能为您澄清一切!