Code covered by the BSD License  

Highlights from
Multivariate analysis and preprocessing of spectral data

image thumbnail
from Multivariate analysis and preprocessing of spectral data by Kateryna Artyushkova
GUI for MVA of spectral data including various preprocessing options and three types of MVA analysis

indd=match(x,y, tol,bro)
function indd=match(x,y, tol,bro)
%   MATCH  function INDD=MATCH(X, Y, TOL, BRO) find the closest
%	values to X in vector Y with tolerance TOL. If TOL  is omitted, the
%   default  value of 1e-6 will be used. CAUTION: Using too small tolerance may
%   exclude some points from results (run example below with tol=0.005)
%   BRO=0 by default and can also be omitted
%   If BRO=0, then all indices of values of Y within the tolerance TOL vill be
%   included in the output. If BRO=1 then one (last or first) value within each range
%   will be reported.  If BRO>1 then one minimum value for each range
%   will be included in output. Value of BRO defines indices range for
%   minimum matching value search (rule of thumb- the coarser your TOL 
%   the bigger BRO should be. Use BRO= twice the maximum number of
%   matching values for each matching point)
%   (Run example below with a=match(val,y,tol, 1);
%   and tol=0.01; to compare outputs)
%	For example:
%	xx=0:0.01:35; y=sin(xx) + cos(xx ./3); 
%	plot(xx,y); grid; hold on;
%	val=1.04; tol=0.05;
%	a=match(val,y,tol); plot(xx(a),y(a),'r.');  % All matching values
%   aa=match(val,y,tol,1);  plot(xx(aa),y(aa),'ms'); % Single value per range
%   aaa=match(val,y,tol,20);  plot(xx(aaa),y(aaa),'go'); % Min value
%
%	see also LMIN,LMAX, LMAX_PW,  LMIN_PW

% 	Sergei Koptenko, Applied Acoustic Technologies, Toronto, Canada
%   sergei.koptenko@sympatico.ca,  March/22/2003  

	if (nargin<4),       bro=0; 
	else,    bro=round(bro);
	end;		% set the default  broadness
		if (nargin<3),   tol=1e-6;  bro=0;  % set the default  tolerance
        end;		
        
 [rrow,ccol]=size(y);
if  (ccol==1), y=y'; end
[rrow,ccol]=size(y);
if  (rrow>1) || (rrow+ccol==2), disp('ERR: Y must be a vector!'); indd=[]; return; end
if ( x>max(y)) || (x< min(y) ), 
    disp('ERR: X is outside of range of Y!');
    indd=[]; return; 
end

indd= find(xor(((x+tol) >=y), ((x-tol)<=y)) ==0); %get all indices within the tolerance

if bro>0,
	difi= diff(indd);              % find index difference
	fdif= find(~(difi-1));     % find neigbouring indices 
	ddff=indd(fdif);           % get neigbouring indices
%----------remove neigbouring indices-------------------
				for k1=1:length(ddff),
                    aa = find(~(indd - ddff(k1)));
                    indd(aa)=0;
				end %k1
	bb=sort(indd);
	indd=bb(find(bb));
%----------find closest value for each range-------------------
			if bro>1,
                innd=1;
                        for j3=1:length(indd),
                               j4=indd(j3)-bro;
                               j5=indd(j3)+bro;
                               dj4=0;
                                    if j4<1, dj4=-j4 +1;
                                        j4=1;
                                    end
                                    if j5>ccol, j5=ccol;end
                               [vv,innd(j3)] = min(abs( y(j4:j5) -x ));
                               innd(j3)=innd(j3) + dj4;
                         end %j3          
                            indd=indd + innd - bro-1;
             end
end 
                          if ~isempty(indd), 
                          if indd(1)<1, indd(1)=1;  end
                           if indd(end)>ccol, indd(end)=ccol; end
                       end
return

Contact us at files@mathworks.com