function [x,V] = soustava(A,b)
%soustava - reseni soustavz linearnich rovnic
%A..matice soustavy
%b..vektor pryvych stran (implicitne nulovy)
%x..partikularni reseni
%V..baze podprostoru reseni homog.soustavy prislusne zadane soustave
%priklad volani: [x,V]=soustava([1 2 3;4 5 6;7 8 9],[6;15;24])

r=size(A,1);    %pocet radku matice A
if nargin<2
    b=zeros(r,1);  %neni-li zadano,resime homog.soustavu 
end

if nargin<1
    error('Zadejte matici soustavy!')    
end
if length(b)~=r     %je vektor b spravne velky?
    error('Vektor pravych stran musi mit tolik prvku jako ma matice soustavy radku!')
end
if size(b,2)>1 %vektor neni sloupcovy
    b=b(:); %prevod na sloupcovy vektor
end

%test resitelnosti (Frobeniova veta)
if rank(A) < rank([A b])
   error('Soustava nema reseni!') 
end

if size(A,2)==r && rank(A)==r %A je cvercova a regularni
        x=A\b;
        V=zeros(r,1);   %reseni homog. soustavy je trivialni
    elseif size(A,2)==r && rank(A)<r % A je ctvercova, ale singularni(A\b nebude fungovat spravne!)
        x=pinv(A)*b;    %vyuzijeme Mooreovu-Penroseovu pseudoinverzi
        V=null(A,'r');
    else %obdelnikova matice
        x=A\b;
        V=null(A,'r');
end