function [A,b,ind]=erzeugeZSF(A,b);
%[A,b,ind]=erzeugeZSF(A,b);
%erzeugt Zeilenstufenform und die Liste der Spaltenindices
%mit (i,ind(i)) erstes Element ~=0 in Zeile i=1:length(ind)
%(aus numerischer Sicht ist der angegebene Algorithmus nicht gut!)

%%% Eingabe prüfen

if(nargin<1)  %ohne A geht es nicht
  error('Als Eingabe wird wenigstens A benötigt');
end 

[m,n]=size(A);

if (nargin<2)  %falls kein b gegeben, Nullvektor verwenden
  b=zeros(m,1);
end

[bm,bn]=size(b);

%%% Prüfung, ob b falsche Länge oder falsche Breite hat
    
if (bm~=m)||(bn~=1)
    error('Die Dimension des Spaltenvektors b passt nicht zu A');
end

%%%% Initialisierung

ind=[];   % Liste der Indices der Zeilenstufenform, die am Anfang leer ist
r=0;      % aktueller Zeilenindex, am Ende der Zeilenrang
colind=1; % erste noch zu untersuchende Spalte 

%%%% Solange nicht alle Zeilen bearbeitet sind

while (r<m)

    %%%% finde erste Spalte !=0 in der Restmatrix A(r+1:m,colind:n);

    while (colind<=n)
        rowind=r+1;
        while (rowind<=m)&&(abs(A(rowind,colind))<1e-10)
	    rowind=rowind+1;
        end
        if (rowind<=m) 
            break;
        end;
        colind=colind+1;
    end

    if (colind>n)
        %Restmatrix hat nur Nullelemente
        break
    end
    
    r=r+1;
    ind=[ind,colind]; % der Index der gefundenen Spalte wird an die Liste angehängt
    
    %%%% tausche die zwei Zeilen

    if (r~=rowind)
        A([r rowind],:)=A([rowind r],:);
        b([r rowind])=b([rowind r]);
    end

    %%%% transformiere Zeilen unter row

    for i=r+1:m
	alpha=A(i,colind)/A(r,colind);
	b(i)=b(i)-alpha*b(r);
	A(i,:)=A(i,:)-alpha*A(r,:);
    end
    
    colind=colind+1;

end
