% --- Icke-nolljägare (med illustrativa möjligheter) ---
% Chalmers Tekniska Högskola, 2002-10-09
% Numerisk Linär Algebra
%
clear all
clc

m=40;
e = ones(m,1);
A = 1000*full(spdiags([1*e 2*e 4*e 2*e 1*e], [-2:2], m, m));
n = length(A);
Aorg = A;

for i=1:n-2
    % nollar xj i 'i' kolonnen
    xi = A(i+1,i);
    xj = A(i+2,i);

    C = xi/sqrt(xi^2+xj^2);                 % cosinustermen
    S = -xj/sqrt(xi^2+xj^2);                % sinustermen
    R = eye(m);
    R(i+1:i+2,i+1:i+2) = [C -S; S C];       % Givens-rotationsmatrisen

    spy(A)                                  % Visar hur R-matrisen ser
    hold on                                 % ut i jämförelse med
    spy(R,'r*')                             % A-matrisen. Bör endast
    hold off                                % användas då
    drawnow                                 % A = round(R*A*R')
    
    A = round(R*A*R');                      % för en exakt lösning, ändra till A = R*A'R
    j = i;
    
    % jagar bort skräptermen
    while j < n-3,

        xi = A(j+3,j+1);
        xj = A(j+4,j+1);
        C = xi/sqrt(xi^2+xj^2);
        S = -xj/sqrt(xi^2+xj^2);
        R = eye(m);
        R(j+3:j+4,j+3:j+4) = [C -S; S C];

        spy(A)                              % Visar hur R-matrisen ser
        hold on                             % ut i jämförelse med
        spy(R,'r*')                         % A-matrisen. Bör endast
        hold off                            % användas då
        drawnow                             % A = round(R*A*R')
    
        A = round(R*A*R');                  % för en exakt lösning, ändra till A = R*A'R


        j = j + 2;
    end
end
spy(A)                                      %
drawnow                                     %

sort(eig(full(A)))-sort(eig(full(Aorg)))    % validerar egenvärdens bevarande

% av Markus Burak & Tobias Tivert
