我想用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
在最初的Lanczos方法中,首先计算矩阵a的最大特征值,然后计算与该特征值对应的特征向量。有了这两个对象,你可以减少你在一个上使用的矩阵的维数,然后找到新矩阵的最大特征值。你要迭代m次其中m是初始矩阵a的维数
但是如果你想同时计算所有的特征值,你需要使用Paige迭代过程(见中间)首先你要建立一个三角矩阵。然后你计算它的特征值,使用一个著名的和快速的算法,因为这样的矩阵是非常稀疏的,通过上面文章中指定的公式,你可以很容易地计算初始矩阵的特征值和它们对应的特征向量。