function B=orto_baze(P,jaka)
%orto_baze - vraci ortogonalni/ortonormalni bazi podprostoru P
%P..podprostor zadany svymi generatory ve sloupcich
%jaka..1 pro ortogonalni, 0 pro ortonormalni bazi (implicitne 0)
%B..prislusna baze ziskana pomoci Grammova - Schmidtova procesu
%priklady volani:
%B=orto_baze([1 -4;4 1;-1 0;3 0])  ta uz je ortog.
%B=orto_baze([1 -3 5;2 1 -1; 0 1 1],1)  
%B=orto_baze([2 1 -2;1 1 -1;0 3 1;1 1 3],0)

if nargin<2
    jaka = 0;
end

if ~isscalar(jaka)
    error('Zadejte 2.vstup jako skalar o hodnote 1 nebo 0!')
end

[m n]=size(P);
dimP=rank(P);   %kolik vektoru bude v bazi B

if dimP == 0
    B=[];
end

B=zeros(m,dimP);    %priprava
i=1;
while rank(P(:,1:i))==0
    i=i+1;   %nalezeni prvniho sloupce, ktery je nenulovym vektorem    
end

%Gramm-Schmidt:
B(:,1)=P(:,1);  %prvni vektor zustava nezmenen
i=2;    %nastaveni indexu do matice B

for j=i:n %pro zbyle sloupce
    xj=P(:,j);  %j-ty soloupce matice P, tj. vektor, ktery se bude ortogonalizovat
    y=xj;   %priprava
        for k=1:i-1     %pro vsechny zatim vypoctene vektory ortog.baze
            yk=B(:,k);
            y=y-dot(xj,yk)/dot(yk,yk)*yk;
        end
    if norm(y)>eps  %vysel skoro nenulovy
        B(:,i)=y;   %pridame vektor do baze
        i=i+1;        
    end
    
end









