Mercurial > hg > mauch-mirex-2010
diff _misc/tools/.svn/text-base/localmaxmin.m.svn-base @ 8:b5b38998ef3b
added all that other stuff
author | matthiasm |
---|---|
date | Fri, 11 Apr 2014 15:54:25 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/_misc/tools/.svn/text-base/localmaxmin.m.svn-base Fri Apr 11 15:54:25 2014 +0100 @@ -0,0 +1,124 @@ +function [x,n]=localmaxmin(y,xn) +%LOCALMAXMIN(Y) Local Maxima and Minima. +% X = LOCALMAXMIN(Y) or LOCALMAXMIN(Y,'max') for vector Y returns a logical +% vector X the same size as Y such that Y(X) contains the local maxima in Y. +% +% N = LOCALMAXMIN(Y,'min') for vector Y returns a logical vector N the same +% size as Y such that Y(N) contains the local minima in Y. +% +% [X,N] = LOCALMAXMIN(Y) for vector Y returns logical vectors X and N such +% that Y(X) contains the local maxima and Y(N) contains the local minima. +% +% When Y is a matrix, outputs are logical array(s) the same size as Y, and +% the minima and/or maxima are computed down the rows of each column in Y. +% +% See also MAX, MIN. + +% D.C. Hanselman, University of Maine, Orono, ME 04469 +% MasteringMatlab@yahoo.com +% Mastering MATLAB 7 +% 2006-03-08 + +mm=['min';'max']; +if nargin==1 + xn='max'; +elseif nargin~=2 + error('localmaxmin:NotEnoughInputArguments',... + 'One or Two Input Arguments Required.') +end +if ~ischar(xn) || isempty(strcmp(xn,mm)) + error('localmaxmin:UnknownArgument','Unknown Second Input Argument.') +end +if ~isnumeric(y) || ~isreal(y) + error('localmaxmin:IncorrectDataType','Y Must be Real Valued.') +end +ysiz=size(y); +isrow=ysiz(1)==1; +if isrow % if row, convert to column for now + y=y'; + ysiz(1)=ysiz(2); + ysiz(2)=1; +end +if ysiz(1)<4 + error('localmaxmin:InsufficientData','Y Must Have at Least 4 Elements.') +end +x=false(ysiz); + +sdiff=sign(diff(y)); +zdiff=sdiff==0; +idz=find(sum(zdiff)); % columns where zero differences appear + +if strcmp(xn,'min') || nargout==2 % get minima + x(2:end-1,:)=diff(sdiff)==2; + x(1,:)=sdiff(1,:)>0; + x(end,:)=sdiff(end,:)<0; + if any(zdiff) + ir=1:ysiz(1); + for k=idz % handle columns with zero differences + itmp=ir; + itmp(zdiff(:,k))=[]; + if all(sdiff(:,k)==0) % entire column is flat + x(:,k)=true; + else + tmp=diff(sign(diff(y(itmp,k))))==2; + x(itmp(tmp)+1,k)=true; + if sdiff(1,k)==0 + nr=find(sdiff(:,k)>0,1); + nf=find(sdiff(:,k)<0,1); + if ~(isempty(nr)||isempty(nf)) + x(1,k)=nr<nf; + end + end + if sdiff(end,k)==0 + nr=find(sdiff(:,k)>0,1,'last'); + nf=find(sdiff(:,k)<0,1,'last'); + if ~(isempty(nr)||isempty(nf)) + x(end,k)=nr<nf; + end + end + end + end + end + if isrow + x=x.'; + end + if nargout==2 + n=x; + end +end +if strcmp(xn,'max') || nargout==2 % get maxima + x=false(ysiz); + x(2:end-1,:)=diff(sdiff)==-2; + x(1,:)=sdiff(1,:)<0; + x(end,:)=sdiff(end,:)>0; + if any(zdiff) + ir=1:ysiz(1); + for k=idz % handle columns with zero differences + itmp=ir; + itmp(zdiff(:,k))=[]; + if all(sdiff(:,k)==0) % entire column is flat + x(:,k)=true; + else + tmp=diff(sign(diff(y(itmp,k))))==-2; + x(itmp(tmp)+1,k)=true; + if sdiff(1,k)==0 + nr=find(sdiff(:,k)>0,1); + nf=find(sdiff(:,k)<0,1); + if ~(isempty(nr)||isempty(nf)) + x(1,k)=nr>nf; + end + end + if sdiff(end,k)==0 + nr=find(sdiff(:,k)>0,1,'last'); + nf=find(sdiff(:,k)<0,1,'last'); + if ~(isempty(nr)||isempty(nf)) + x(end,k)=nr>nf; + end + end + end + end + end + if isrow + x=x'; + end +end