function [Lnew,W,Pi] = preprocL(L)
%preprocL Pre-processing of L matrix in a discrete ill-posed problem
%
% [Lnew] = preprocL(L)
% [Lnew,W] = preprocL(L)
% [R,W,Pi] = preprocL(L)
%
% This function pre-processes any matrix L such that it can be used by all
% the functions of Regularization Tools. There are no requirements on the
% dimensions or rank of L. The output matrix Lnew is r-by-n, where r is
% the rank of L. There is no need to use this function is L is known to
% have full row rank.
%
% If one or two output arguments are used, then for any x we have
% || L x ||_2 = || Lnew x ||_2 ,
% and therefore in Regularization Tools one should replace L by Luse.
% The matrix W holds an approximate basis for the null space of Lnew.
%
% If three output arguments are used, then we return the factors of
% Lnew = R*Pi', and for any x we have
% || L x ||_2 = || R Pi' x ||_2 .
% Hence one can replace L by R, x by xnew = Pi'*x; and A by Anew = A*pi.
% Pivoting ensures that the leading r-by-r submatrix of R is almost as well
% conditioned as possible (desirable when standard-form transformation
% "method 2" is used). The matrix W holds an approximate basis for the
% null space of R as required in the function std_form.
% Per Christian Hansen, DTU Informatics, May 20, 2011.
[p,n] = size(L);
if p