localmax2.m
author A.M. Thurnherr <athurnherr@yahoo.com>
Tue, 29 Jun 2021 09:14:43 -0400
changeset 23 e83393696a24
parent 0 0a450563f904
permissions -rw-r--r--
IX_14 Release Version
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
     1
function [xout,yout,imaxout] = localmax2(X,Y);
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
     2
% LOCALMAX2 - find local maxima by parabola fitting
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
     3
% 		[xm,ym]=LOCALMAX2(x,y) returns maxima for every triplet of points (along 1st dim). 
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
     4
% 		xm(i,j)=NaN means that there is no local maximum of y(:,j)=F{x(:,j)} between x(i,j) and x(i+2,j)
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
     5
%		x may be the same size as y or as y(:,1) 
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
     6
%  added to find the three highest points of array
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
     7
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
     8
% August 2001, ashcherbina@ucsd.edu
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
     9
% April 2004, Visbeck visbeck@ldeo.columbia.edu
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    10
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    11
% fix array sizes
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    12
if size(X,1)==size(Y,1) & size(X,2)==1
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    13
   X=repmat(X,1,size(Y,2));
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    14
end
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    15
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    16
% find maximum
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    17
[dum,imax]=max(Y);
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    18
xout=imax+nan;
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    19
yout=imax+nan;
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    20
imaxout=imax+nan;
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    21
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    22
% select valid indices for fit
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    23
iok=find(imax>1 & imax<(size(Y,1)));
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    24
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    25
% restrict to valid values
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    26
imaxout(iok)=imax(iok);
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    27
imaxn=imax(iok);
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    28
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    29
if length(iok)>0
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    30
  disp([' localmax2: found ',int2str(length(iok)),' valid values'])
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    31
else
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    32
 disp([' localmax2 found no valid values'])
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    33
 return
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    34
end
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    35
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    36
for i=1:length(imaxn)
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    37
 j=iok(i);
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    38
 x1(i)=X(imaxn(i)-1,j);
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    39
 x2(i)=X(imaxn(i),j);
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    40
 x3(i)=X(imaxn(i)+1,j);
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    41
 y1(i)=Y(imaxn(i)-1,j);
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    42
 y2(i)=Y(imaxn(i),j);
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    43
 y3(i)=Y(imaxn(i)+1,j);
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    44
end
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    45
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    46
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    47
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    48
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    49
% compute fit to parabola 
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    50
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    51
a=(x3.*y2+x1.*y3-x1.*y2-y3.*x2-y1.*x3+y1.*x2)./...
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    52
   (x3.*x2.^2-x1.*x2.^2+x1.*x3.^2-x1.^2.*x3+x1.^2.*x2-x3.^2.*x2);
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    53
b=-(-x2.^2.*y3+x2.^2.*y1-y2.*x1.^2+y3.*x1.^2-x3.^2.*y1+y2.*x3.^2)./...
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    54
   ((-x3+x2).*(x2.*x3-x2.*x1+x1.^2-x3.*x1) );
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    55
c=(x2.^2.*y1.*x3-x2.^2.*x1.*y3-x3.^2.*y1.*x2+...
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    56
   y3.*x1.^2.*x2+x3.^2.*x1.*y2-y2.*x1.^2.*x3)./...
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    57
   ((-x3+x2).*(x2.*x3-x2.*x1+x1.^2-x3.*x1));
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    58
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    59
% check for maximum in range
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    60
xn=x1+nan;
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    61
ii=find(a<0);
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    62
xn(ii)=-b(ii)./a(ii)/2;
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    63
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    64
% compute max taget strength if desired
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    65
xout(iok)=xn;
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    66
if nargout>1
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    67
   yn=xn.^2.*a+xn.*b+c;
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    68
   yout(iok)=yn;
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    69
end
0a450563f904 VIX_6: first version for Mercurial release
A.M. Thurnherr <ant@ldeo.columbia.edu>
parents:
diff changeset
    70