Code covered by the BSD License  

Highlights from
slatec

from slatec by Ben Barrowes
The slatec library converted into matlab functions.

[a,mda,m,n1,n2,prgopt,x,wnorm,mode,ws,is]=lpdp(a,mda,m,n1,n2,prgopt,x,wnorm,mode,ws,is);
function [a,mda,m,n1,n2,prgopt,x,wnorm,mode,ws,is]=lpdp(a,mda,m,n1,n2,prgopt,x,wnorm,mode,ws,is);
persistent fac firstCall i iw ix j l modew n np1 one rnorm sc ynorm zero ; if isempty(firstCall),firstCall=1;end; 

if isempty(i), i=0; end;
if isempty(iw), iw=0; end;
if isempty(ix), ix=0; end;
if isempty(j), j=0; end;
if isempty(l), l=0; end;
if isempty(modew), modew=0; end;
if isempty(n), n=0; end;
if isempty(np1), np1=0; end;
%***BEGIN PROLOGUE  LPDP
%***SUBSIDIARY
%***PURPOSE  Subsidiary to LSEI
%***LIBRARY   SLATEC
%***TYPE      SINGLE PRECISION (LPDP-S, DLPDP-D)
%***AUTHOR  Hanson, R. J., (SNLA)
%           Haskell, K. H., (SNLA)
%***DESCRIPTION
%
%     DIMENSION A(MDA,N+1),PRGOPT(*),X(N),WS((M+2)*(N+7)),IS(M+N+1),
%     where N=N1+N2.  This is a slight overestimate for WS(*).
%
%     Determine an N1-vector W, and
%               an N2-vector Z
%     which minimizes the Euclidean length of W
%     subject to G*W+H*Z .GE. Y.
%     This is the least projected distance problem, LPDP.
%     The matrices G and H are of respective
%     dimensions M by N1 and M by N2.
%
%     Called by subprogram LSI( ).
%
%     The matrix
%                (G H Y)
%
%     occupies rows 1,...,M and cols 1,...,N1+N2+1 of A(*,*).
%
%     The solution (W) is returned in X(*).
%                  (Z)
%
%     The value of MODE indicates the status of
%     the computation after returning to the user.
%
%          MODE=1  The solution was successfully obtained.
%
%          MODE=2  The inequalities are inconsistent.
%
%***SEE ALSO  LSEI
%***ROUTINES CALLED  SCOPY, SDOT, SNRM2, SSCAL, WNNLS
%***REVISION HISTORY  (YYMMDD)
%   790701  DATE WRITTEN
%   891214  Prologue converted to Version 4.0 format.  (BAB)
%   900328  Added TYPE section.  (WRB)
%   910408  Updated the AUTHOR section.  (WRB)
%***end PROLOGUE  LPDP
%
%     SUBROUTINES CALLED
%
%     WNNLS         SOLVES A NONNEGATIVELY CONSTRAINED LINEAR LEAST
%                   SQUARES PROBLEM WITH LINEAR EQUALITY CONSTRAINTS.
%                   PART OF THIS PACKAGE.
%
%++
%     SDOT,         SUBROUTINES FROM THE BLAS PACKAGE.
%     SSCAL,SNRM2,  SEE TRANS. MATH. SOFT., VOL. 5, NO. 3, P. 308.
%     SCOPY
%
a_shape=size(a);a=reshape([a(:).',zeros(1,ceil(numel(a)./prod([mda])).*prod([mda])-numel(a))],mda,[]);
prgopt_shape=size(prgopt);prgopt=reshape(prgopt,1,[]);
ws_shape=size(ws);ws=reshape(ws,1,[]);
x_shape=size(x);x=reshape(x,1,[]);
is_shape=size(is);is=reshape(is,1,[]);
if isempty(fac), fac=0; end;
if isempty(one), one=0; end;
if isempty(rnorm), rnorm=0; end;
if isempty(sc), sc=0; end;
if isempty(ynorm), ynorm=0; end;
if isempty(zero), zero=0; end;
if firstCall,   zero =[0.0e0];  end;
if firstCall,  one=[1.0e0];  end;
if firstCall,  fac=[0.1e0];  end;
firstCall=0;
%***FIRST EXECUTABLE STATEMENT  LPDP
n = fix(n1 + n2);
mode = 1;
if( m>0 )
np1 = fix(n + 1);
%
%     SCALE NONZERO ROWS OF INEQUALITY MATRIX TO HAVE LENGTH ONE.
for i = 1 : m;
[sc ,n,a(sub2ind(size(a),i,1):end),mda]=snrm2(n,a(sub2ind(size(a),i,1):end),mda);
if( sc~=zero )
sc = one./sc;
[np1,sc,a(sub2ind(size(a),i,1):end),mda]=sscal(np1,sc,a(sub2ind(size(a),i,1):end),mda);
end;
end; i = fix(m+1);
%
%     SCALE RT.-SIDE VECTOR TO HAVE LENGTH ONE (OR ZERO).
[ynorm ,m,a(sub2ind(size(a),1,np1):end)]=snrm2(m,a(sub2ind(size(a),1,np1):end),1);
if( ynorm~=zero )
sc = one./ynorm;
[m,sc,a(sub2ind(size(a),1,np1):end)]=sscal(m,sc,a(sub2ind(size(a),1,np1):end),1);
end;
%
%     SCALE COLS OF MATRIX H.
j = fix(n1 + 1);
while( j<=n );
[sc ,m,a(sub2ind(size(a),1,j):end)]=snrm2(m,a(sub2ind(size(a),1,j):end),1);
if( sc~=zero )
sc = one./sc;
end;
[m,sc,a(sub2ind(size(a),1,j):end)]=sscal(m,sc,a(sub2ind(size(a),1,j):end),1);
x(j) = sc;
j = fix(j + 1);
end;
if( n1>0 )
%
%     COPY TRANSPOSE OF (H G Y) TO WORK ARRAY WS(*).
iw = 0;
for i = 1 : m;
%
%     MOVE COL OF TRANSPOSE OF H INTO WORK ARRAY.
[n2,a(sub2ind(size(a),i,n1+1):end),mda,ws(sub2ind(size(ws),max(iw+1,1)):end)]=scopy(n2,a(sub2ind(size(a),i,n1+1):end),mda,ws(sub2ind(size(ws),max(iw+1,1)):end),1);
iw = fix(iw + n2);
%
%     MOVE COL OF TRANSPOSE OF G INTO WORK ARRAY.
[n1,a(sub2ind(size(a),i,1):end),mda,ws(sub2ind(size(ws),max(iw+1,1)):end)]=scopy(n1,a(sub2ind(size(a),i,1):end),mda,ws(sub2ind(size(ws),max(iw+1,1)):end),1);
iw = fix(iw + n1);
%
%     MOVE COMPONENT OF VECTOR Y INTO WORK ARRAY.
ws(iw+1) = a(i,np1);
iw = fix(iw + 1);
end; i = fix(m+1);
ws(iw+1) = zero;
[n,dumvar2,dumvar3,dumvar2]=scopy(n,ws(sub2ind(size(ws),max(iw+1,1)):end),0,ws(sub2ind(size(ws),max(iw+1,1)):end),1);   dumvar2i=find((ws(sub2ind(size(ws),max(iw+1,1)):end))~=(dumvar2));   ws(iw+1-1+dumvar2i)=dumvar2(dumvar2i); 
iw = fix(iw + n);
ws(iw+1) = one;
iw = fix(iw + 1);
%
%     SOLVE EU=F SUBJECT TO (TRANSPOSE OF H)U=0, U.GE.0.  THE
%     MATRIX E = TRANSPOSE OF (G Y), AND THE (N+1)-VECTOR
%     F = TRANSPOSE OF (0,...,0,1).
ix = fix(iw + 1);
iw = fix(iw + m);
%
%     DO NOT CHECK LENGTHS OF WORK ARRAYS IN THIS USAGE OF WNNLS( ).
is(1) = 0;
is(2) = 0;
[ws,np1,n2,dumvar4,m,dumvar6,prgopt,dumvar8,rnorm,modew,is,dumvar12]=wnnls(ws,np1,n2,np1-n2,m,0,prgopt,ws(sub2ind(size(ws),max(ix,1)):end),rnorm,modew,is,ws(sub2ind(size(ws),max(iw+1,1)):end));   dumvar8i=find((ws(sub2ind(size(ws),max(ix,1)):end))~=(dumvar8));dumvar12i=find((ws(sub2ind(size(ws),max(iw+1,1)):end))~=(dumvar12));   ws(ix-1+dumvar8i)=dumvar8(dumvar8i); ws(iw+1-1+dumvar12i)=dumvar12(dumvar12i); 
%
%     COMPUTE THE COMPONENTS OF THE SOLN DENOTED ABOVE BY W.
sc = one - sdot(m,a(sub2ind(size(a),1,np1):end),1,ws(sub2ind(size(ws),max(ix,1)):end),1);
if( one+fac.*abs(sc)==one || rnorm<=zero )
mode = 2;
a_shape=zeros(a_shape);a_shape(:)=a(1:numel(a_shape));a=a_shape;
prgopt_shape=zeros(prgopt_shape);prgopt_shape(:)=prgopt(1:numel(prgopt_shape));prgopt=prgopt_shape;
ws_shape=zeros(ws_shape);ws_shape(:)=ws(1:numel(ws_shape));ws=ws_shape;
x_shape=zeros(x_shape);x_shape(:)=x(1:numel(x_shape));x=x_shape;
is_shape=zeros(is_shape);is_shape(:)=is(1:numel(is_shape));is=is_shape;
return;
else;
sc = one./sc;
for j = 1 : n1;
x(j) = sc.*sdot(m,a(sub2ind(size(a),1,j):end),1,ws(sub2ind(size(ws),max(ix,1)):end),1);
end; j = fix(n1+1);
%
%     COMPUTE THE VECTOR Q=Y-GW.  OVERWRITE Y WITH THIS VECTOR.
for i = 1 : m;
a(i,np1) = a(i,np1) - sdot(n1,a(sub2ind(size(a),i,1):end),mda,x,1);
end; i = fix(m+1);
end;
end;
if( n2>0 )
%
%     COPY TRANSPOSE OF (H Q) TO WORK ARRAY WS(*).
iw = 0;
for i = 1 : m;
[n2,a(sub2ind(size(a),i,n1+1):end),mda,ws(sub2ind(size(ws),max(iw+1,1)):end)]=scopy(n2,a(sub2ind(size(a),i,n1+1):end),mda,ws(sub2ind(size(ws),max(iw+1,1)):end),1);
iw = fix(iw + n2);
ws(iw+1) = a(i,np1);
iw = fix(iw + 1);
end; i = fix(m+1);
ws(iw+1) = zero;
[n2,dumvar2,dumvar3,dumvar2]=scopy(n2,ws(sub2ind(size(ws),max(iw+1,1)):end),0,ws(sub2ind(size(ws),max(iw+1,1)):end),1);   dumvar2i=find((ws(sub2ind(size(ws),max(iw+1,1)):end))~=(dumvar2));   ws(iw+1-1+dumvar2i)=dumvar2(dumvar2i); 
iw = fix(iw + n2);
ws(iw+1) = one;
iw = fix(iw + 1);
ix = fix(iw + 1);
iw = fix(iw + m);
%
%     SOLVE RV=S SUBJECT TO V.GE.0.  THE MATRIX R =(TRANSPOSE
%     OF (H Q)), WHERE Q=Y-GW.  THE (N2+1)-VECTOR S =(TRANSPOSE
%     OF (0,...,0,1)).
%
%     DO NOT CHECK LENGTHS OF WORK ARRAYS IN THIS USAGE OF WNNLS( ).
is(1) = 0;
is(2) = 0;
[ws,dumvar2,dumvar3,dumvar4,m,dumvar6,prgopt,dumvar8,rnorm,modew,is,dumvar12]=wnnls(ws,n2+1,0,n2+1,m,0,prgopt,ws(sub2ind(size(ws),max(ix,1)):end),rnorm,modew,is,ws(sub2ind(size(ws),max(iw+1,1)):end));   dumvar8i=find((ws(sub2ind(size(ws),max(ix,1)):end))~=(dumvar8));dumvar12i=find((ws(sub2ind(size(ws),max(iw+1,1)):end))~=(dumvar12));   ws(ix-1+dumvar8i)=dumvar8(dumvar8i); ws(iw+1-1+dumvar12i)=dumvar12(dumvar12i); 
%
%     COMPUTE THE COMPONENTS OF THE SOLN DENOTED ABOVE BY Z.
sc = one - sdot(m,a(sub2ind(size(a),1,np1):end),1,ws(sub2ind(size(ws),max(ix,1)):end),1);
if( one+fac.*abs(sc)==one || rnorm<=zero )
mode = 2;
a_shape=zeros(a_shape);a_shape(:)=a(1:numel(a_shape));a=a_shape;
prgopt_shape=zeros(prgopt_shape);prgopt_shape(:)=prgopt(1:numel(prgopt_shape));prgopt=prgopt_shape;
ws_shape=zeros(ws_shape);ws_shape(:)=ws(1:numel(ws_shape));ws=ws_shape;
x_shape=zeros(x_shape);x_shape(:)=x(1:numel(x_shape));x=x_shape;
is_shape=zeros(is_shape);is_shape(:)=is(1:numel(is_shape));is=is_shape;
return;
else;
sc = one./sc;
for j = 1 : n2;
l = fix(n1 + j);
x(l) = sc.*sdot(m,a(sub2ind(size(a),1,l):end),1,ws(sub2ind(size(ws),max(ix,1)):end),1).*x(l);
end; j = fix(n2+1);
end;
end;
%
%     ACCOUNT FOR SCALING OF RT.-SIDE VECTOR IN SOLUTION.
[n,ynorm,x]=sscal(n,ynorm,x,1);
[wnorm ,n1,x]=snrm2(n1,x,1);
else;
if( n>0 )
x(1) = zero;
x_orig=x;    [n,x,dumvar3,dumvar4]=scopy(n,x,0,x,1);    x(dumvar4~=x_orig)=dumvar4(dumvar4~=x_orig);
end;
wnorm = zero;
end;
a_shape=zeros(a_shape);a_shape(:)=a(1:numel(a_shape));a=a_shape;
prgopt_shape=zeros(prgopt_shape);prgopt_shape(:)=prgopt(1:numel(prgopt_shape));prgopt=prgopt_shape;
ws_shape=zeros(ws_shape);ws_shape(:)=ws(1:numel(ws_shape));ws=ws_shape;
x_shape=zeros(x_shape);x_shape(:)=x(1:numel(x_shape));x=x_shape;
is_shape=zeros(is_shape);is_shape(:)=is(1:numel(is_shape));is=is_shape;
end %subroutine lpdp
%DECK LSAME

Contact us at files@mathworks.com