home *** CD-ROM | disk | FTP | other *** search
- function [gt,d]=findmax(data, flag)
- %FINDMAX Interpolates the maxima in a vector of data.
- %
- % Function used for returning all the maxima in a set of
- % data (vector or matrices). The maxima are calculated by
- % cubic or quadratic interpolation.
- [m,n]=size(data);
- if nargin < 2, flag = 1; end
- % 1-D
- d = [2, 2];
- if m==1 | n==1
- data=data(:);
- n=max([n,m]);
- ind=find( (data>[data(1)-1;data(1:n-1)]) & (data>=[data(2:n);data(n)-1]) );
- s=length(ind);
- gt=zeros(s,1);
- for i=1:s
- ix=ind(i);
- factor = 1;
- err = 0; % Smoothness factor
- if (ix==1 | ix==n);
- gt(i)=data(ix);
- elseif ix>n-3 | ix<4
- if data(ix-1)==data(ix)&data(ix+1)==data(ix)
- gt(i)=data(ix);
- else
- gt(i)=quad2(data(ix-1:ix+1));
- end
- elseif data(ix+2)<data(ix+1)
- [gt(i), err] = cubic(data(ix-1:ix+2), data(ix-2), 0);
- elseif data(ix-2)<data(ix-1)
- gt(i)=cubic(data(ix-2:ix+1));
- elseif data(ix)>data(ind(i+1))
- gt(i)=quad2(data(ix-1:ix+1));
- factor = 0.75;
- else
- gt(i)=data(ix);
- factor = 0.5;
- end
-
- % Discretization interval estimation
- % Aim: keep error less than 1/10 of abs(constraint) greater than 0
- % or 1/50 of smoothness factor.
- % error = data(ix) - gt(i)
- if flag
- if ~err
- err = data(ix) - gt(i);
- end
- f = abs((gt(i) + 1.1e-5) /(10 * err + 1e-5));
- d(1,1) = min(d(1,1), factor * ((f>=0.3) + (0.7 + f)*(f< 0.3) +(f>1)*(log(f)/100)) );
- end
- end
- else
- % 2D
- [gt, d] = findmax2(data, flag);
- end
- if (m*n)<4, d=[0.5,0.5]; end
-