Код простого алгоритма Ланцоша для получения собственных значений и собственных векторов симметричной матрицы

Я хотел бы написать простую программу (на языке 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

person Manolete    schedule 11.01.2013    source источник


Ответы (1)


В исходном методе Ланцоша сначала нужно подсчитать наибольшее собственное значение матрицы A. После этого подсчитать собственный вектор, соответствующий этому собственному значению. Сосчитав эти два объекта, вы можете уменьшить размер матрицы, которую вы используете, на один, а затем найти максимальное собственное значение новой матрицы. И вы должны повторить это m раз, где m - размерность исходной матрицы A.

Но если вы хотите подсчитать все собственные значения одновременно, вы должны использовать итеративную процедуру Пейджа (см. посередине) в котором сначала вы строите трехугольную матрицу. Затем вы считаете ее собственные значения, используя один из известных и быстрых алгоритмов, так как такая матрица очень разреженная и по формулам, указанным в статье выше, вы можете легко посчитать собственные значения исходной матрицы и соответствующие им собственные векторы.

person Meriadoc Brandybuck    schedule 17.01.2013