home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 10 / 10.iso / l / l455 / 4.ddi / OPTIM.DI$ / FINDMAX.M < prev    next >
Encoding:
Text File  |  1993-03-11  |  1.5 KB  |  58 lines

  1. function [gt,d]=findmax(data, flag)
  2. %FINDMAX Interpolates the maxima in a vector of data.
  3. %
  4. %    Function used for returning all the maxima in a set of
  5. %    data (vector or matrices). The maxima are calculated by
  6. %    cubic or quadratic interpolation.
  7. [m,n]=size(data);
  8. if nargin < 2, flag = 1; end
  9. % 1-D
  10. d = [2, 2];
  11. if m==1 | n==1
  12.     data=data(:);
  13.     n=max([n,m]);
  14.     ind=find( (data>[data(1)-1;data(1:n-1)]) & (data>=[data(2:n);data(n)-1]) );
  15.     s=length(ind);
  16.     gt=zeros(s,1);
  17.     for i=1:s
  18.         ix=ind(i);
  19.         factor = 1;
  20.         err = 0;  % Smoothness factor
  21.         if (ix==1 | ix==n);
  22.             gt(i)=data(ix);
  23.         elseif ix>n-3 | ix<4
  24.             if data(ix-1)==data(ix)&data(ix+1)==data(ix)
  25.                 gt(i)=data(ix);
  26.             else
  27.                 gt(i)=quad2(data(ix-1:ix+1));
  28.             end
  29.         elseif data(ix+2)<data(ix+1) 
  30.             [gt(i), err] = cubic(data(ix-1:ix+2), data(ix-2), 0);
  31.         elseif data(ix-2)<data(ix-1) 
  32.             gt(i)=cubic(data(ix-2:ix+1));
  33.         elseif data(ix)>data(ind(i+1))
  34.             gt(i)=quad2(data(ix-1:ix+1));
  35.             factor = 0.75; 
  36.         else
  37.             gt(i)=data(ix);
  38.             factor = 0.5;
  39.         end
  40.  
  41. % Discretization interval estimation
  42. % Aim: keep error less than 1/10 of abs(constraint) greater than 0
  43. %    or  1/50 of smoothness factor.
  44. % error = data(ix) - gt(i)
  45.         if flag 
  46.             if ~err
  47.                 err = data(ix) - gt(i);
  48.             end
  49.             f = abs((gt(i) + 1.1e-5) /(10 * err + 1e-5));
  50.             d(1,1) = min(d(1,1), factor * ((f>=0.3) + (0.7 + f)*(f< 0.3) +(f>1)*(log(f)/100)) );
  51.         end
  52.     end
  53. else
  54. % 2D
  55.     [gt, d] = findmax2(data, flag); 
  56. end
  57. if (m*n)<4, d=[0.5,0.5]; end
  58.