%------------------------------------------
% Esta función hace uso de la factorización QR
% para el cálculo de autovalores y autovectores
% de una matriz K. Los autovectores son la primera
% salida de la función, mientras que los autovalores
% son la segunda salida de la función. Los autovalores
% los saco como un vector
%------------------------------------------
 
function [V,Lambda]  =  MyQRIterationAlgorithm(K)
 
%---------------------------------------
% Inicio
%---------------------------------------
condition  =  1;
Iter       =  0;
tol        =  1e-5;
maxIter    =  1e3;  % Número máximo de iteraciones que mi paciencia aguanta
Qtot       =  eye(size(K));
while condition==1   
    %-----------------------------------
    % Algoritmo
    %-----------------------------------
    Iter   =  Iter + 1;   
    [Q,R]  =  MyQRFactorisation(K);  
    K      =  R*Q;    
    Qtot   =  Qtot*Q;  %  Qtot=Q0*Q1*Q2*...*Qn-1
    %-----------------------------------
    % Criterio de parada
    %-----------------------------------
    I1     =  sum(abs(K(:)));  %  sumamos el valor absoluto de 
    %todos los elementos de K
    I2     =  sum(abs(diag(K))); % sumamos el valor absoluto de 
    %  todos los elementos de la diagonal de K
    diff   =  abs(I1 - I2)/I1;
    %fprintf('%.10f\n',diff)
    if diff<tol
       condition  =  0;      
    end
    if Iter>maxIter
      break;
    end
end
%---------------------------------------------------
% Obtengo los autovectores
%---------------------------------------------------
VV    =   Qtot;
for i=1:size(K,1)
    VV(:,i)  =  VV(:,i)/norm(VV(:,i));
end
%------------------------------------------------------
% Ordeno los autovalores y autovectores
%------------------------------------------------------
[Lambda,Index]   =  sort(diag(K));
V                =  VV(:,Index);
end
