function ortogonalisering()
% Demo av Gram-Schmidts metod i 3-D.
% Funktionen anropas utan argument
% Du matar upprepade gånger in tre linob. vektorer.
% Funktionen 
%     redovisar en ortonormerad bas beräknad med Gram-Schmidts metod.
%     ritar upp inmatade vektorer och ortonormerade baser.
%     testar att de beräknade vektorerna är ortonormala.
while 1
    val=menu('Vill Du mata in tre linob. som kolonnvektorer?','ja','nej');
    if val~=1
        break
    end
    clear all
    for k=1:3
        V(1:3,k)=input(['Mata in vektor ',num2str(k),' som kolonnvektor: ']);
        % Test av indata:
        if rank(V)~=k
            disp('Inmatade vektorer linjärt beroende: Fel indata.')
            return
        end
        % Gram-Schmidt:
        vekt=zeros(3,1);
        for j=1:k-1
            vekt=vekt+dot(V(:,k),Q(:,j))*Q(:,j);
        end
        % Här beräknas de nya ortogonala vektorerna:
        Q(:,k)=V(:,k)-vekt; 
        % Normera vektorerna:
        Q(:,k)=Q(:,k)/norm(Q(:,k));
    end
    % Test av beräkningarna:
    disp('Inmatade vektorer:')
    disp(V)
    disp('Ortonormerade vektorer:')
    disp(Q)
    disp('Normen av matrisen Q med de ortonormerade vektorerna som kolonner:')
    disp(norm(Q))
    disp('Q''*Q:')
    disp(Q'*Q)
    % Grafik:
    clf
    for k=1:3
       quiver3(0,0,0,V(1,k),V(2,k),V(3,k),0,'k')
       hold on
       quiver3(0,0,0,Q(1,k),Q(2,k),Q(3,k),0,'r','linewidth',3)
    end 
    axis equal;
    xlabel('förstakomponenter');
    ylabel('andrakomponenter');
    zlabel('tredjekomponenter');
    title(['Demo av Gram-Schmidt:                     ';...
           'inmatade vektorer svarta, ortogonala röda.'])
    shg
end