matlab - 用循环 block 对 block 循环矩阵进行对角化

标签 matlab matrix fft

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 (C1C2)是一个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 Fsymmetric ,这意味着 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/

相关文章:

用于任意元素类型的 Haskell 线性代数矩阵库

matlab图像处理错误

java - 来自 FFT 的有用音频数据

Matlab:2 行 10 列的子图

c# - Matlab 和 C# 应用程序之间的 WCF

matlab - 在 Matlab 中更有效地遍历矩阵元素

python - 使用python通过fft进行频谱图

MATLAB - 用子矩阵创建矩阵

performance - Matlab + CUDA 求解矩阵向量方程 A*x=B 速度慢

python - Matlab中单引号(')的含义是什么,以及如何将其更改为python