function [L,U,P] = fattLUpiv(A)
%
% Fattorizzazione LU con pivotazione per righe.
%
%            PA=LU
%
% Parametri di ingresso
%  A    matrice da fattorizzare
%
% Parametri in uscita
% L     matrice triangolare inferiore
% U     matrice triangolare superiore
% P     matrice di permutazione 
%
% Autore: Stefano De Marchi
%
[n,m]=size(A);
a=A;
for k=1:n-1
%-------------------------------------------------
% k e' il contatore dei passi del Met. El. di Gauss
%
% Ciclo di ricerca dell'elemento di modulo
% massimo nella matrice A(k)
%
amax=0;
for i=k:n
 if abs(a(i,k)) > amax
  amax=abs(a(i,k));
  p=i;
  q=k;
 end
end
r(k)=p;
c(k)=q;
%
% Scambio tra la riga k e la riga p
%
t=a(p,:);
a(p,:)=a(k,:);
a(k,:)=t;


%
% Passo di eliminazione 
%
for j=k+1:n
w(j)=a(k,j);
end
for i=k+1:n
  eta=a(i,k)/a(k,k);
  a(i,k)=eta;
  for j=k+1:n
     a(i,j)=a(i,j)-eta*w(j);
  end
end
end             % Fine ciclo su k



%
% Costruzione matrici L, U, P
%
L=tril(a,-1)+diag(diag(ones(n)));

U=triu(a);


P=diag(diag(ones(n)));

for k=n-1:-1:1
I=diag(diag(ones(n)));
for j=1:n
aa=I(k,j);
I(k,j)=I(r(k),j);
I(r(k),j)=aa;
end
P=P*I;
end


return

