Code covered by the BSD License  

Highlights from
Unimodal regression

from Unimodal regression by Rasmus Bro
Unimodal least squares regression routine.

b=ulsrfix(x,MaxLoc);
function b=ulsrfix(x,MaxLoc);

%
% Copyright 1997
%
% Rasmus Bro
% Royal Veterinary & Agricultural University
% Denmark
% rb@kvl.dk

I=length(x);

if MaxLoc==1
   b=monreg(flipud(x));
   b=flipud(b);
   break
elseif MaxLoc==I
   b=monreg(x);
   break
end

[b1,B1]=monreg(x(1:MaxLoc-1));
[b2,B2]=monreg(flipud(x(MaxLoc+1:I)));

GoOn=1;
  if x(MaxLoc)>max(b1(MaxLoc-1),b2(I-MaxLoc))
     b=[b1;x(MaxLoc);flipud(b2)];
  else
     Max=[x(MaxLoc) 1];
     while GoOn
       if max(size(B1))==0
          maxB1=0;
       else
          maxB1pos=size(B1,1);
          maxB1=B1(size(B1,1),:);
       end
       if max(size(B2))==0
          maxB2=0;
       else
          maxB2pos=size(B2,1);
          maxB2=B2(size(B2,1),:);
       end
       if maxB1(1)>Max(1) & maxB1(1)>=maxB2(1)
          summ=B1(maxB1pos,2)+Max(2);
          Max=[(maxB1(1)*maxB1(2)+Max(1)*Max(2))/summ summ];
          B1=B1(1:size(B1,1)-1,:);
       elseif maxB2(1)>Max(1) & maxB2(1)>=maxB1(1)
          summ=B2(maxB2pos,2)+Max(2);
          Max=[(maxB2(1)*maxB2(2)+Max(1)*Max(2))/summ summ];
          B2=B2(1:size(B2,1)-1,:);
       else
          GoOn=0;
       end
     end
     B=[B1;Max;flipud(B2)];
     b=[];
     for i=1:size(B,1)
       b=[b;zeros(B(i,2),1)+B(i,1)];
     end
  end

Contact us at files@mathworks.com