3

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) は巡回行列です。BCCB は次の式に従って対角化できることを読みました (ここを参照)。ここで、 は 2 次元離散フーリエ変換行列、は の共役、 はエントリが の固有値である対角行列です。A =F*·D·FFF*FDA

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]

ここでは、 の 2 番目と 4 番目の列Aが入れ替わっています。エラーはどこにありますか?

4

1 に答える 1

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

これにより、次の結果が得られます。

D =
    10    0    0    0
     0   -2    0    0
     0    0   -4    0
     0    0    0    0

A2 次元 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ます。

これがあなたのために物事を明確にすることを願っています!

于 2013-06-09T16:09:48.270 に答える