3

Lanczos アルゴリズムを使用して (C で) 簡単なプログラムを書きたいと思います。アルゴリズムをもう少し理解するのに役立つMatlabの例に出くわしましたが、このコードからは固有値と固有ベクトルを取得する方法がわかりません。アルゴリズムに従うことはできますが、何かが欠けているに違いないと思います。メソッドを理解して C でコーディングできるように、誰かがこの例から固有値を取得するようにガイドできますか?

% Create a random symmetric matrix 
D=6
for i=1:D,
    for j=1:i,
        A(i,j)=rand; 
        A(j,i)=A(i,j);
    end 
end

% Iteration with j=0 
r0 = rand(D,1); 
b0 = sqrt(r0'*r0); 
q1 = r0/b0; 
a1 = q1'*A*q1

%Iteration with j=1
r1 = A*q1 - a1*q1
b1 = sqrt(r1'*r1)
q2 = r1/b1;
a2 = q2'*A*q2

%Iteration with j=2
r2 = A*q2 - a2*q2 - b1*q1;
b2 = sqrt(r2'*r2)
q3 = r2/b2
a3 = q3'*A*q3

% Create Matrix Q
Q = [q1 q2 q3];

%Check orthogonality
EYE = Q'*Q
T = Q'*A*Q
4

1 に答える 1

1

最初の Lanczos 法では、最初に行列 A の最大の固有値を数えます。その後、この固有値に対応する固有ベクトルを数えます。この 2 つのオブジェクトをカウントすると、使用している行列の次元を減らすことができ、新しい行列の最大固有値を見つけることができます。そして、これを m 回繰り返します。ここで、m は初期行列 A の次元です。

しかし、すべての固有値を同時に数えたい場合は、 最初に三重対角行列を作成するPaige 反復手順 (中央を参照)を使用する必要があります。次に、そのような行列は非常にまばらであり、上記の記事で指定された式によって、初期行列の固有値とそれに対応する固有ベクトルを簡単に数えることができるため、よく知られている高速アルゴリズムの 1 つを使用して固有値を数えます。

于 2013-01-17T18:31:37.417 に答える