source: proiecte/pmake3d/make3d_original/Make3dSingleImageStanford_version0.1/third_party/local_ext_mod/match.m @ 37

Last change on this file since 37 was 37, checked in by (none), 14 years ago

Added original make3d

File size: 3.3 KB
Line 
1function indd=match(x,y, tol,bro)
2%   MATCH  function INDD=MATCH(X, Y, TOL, BRO) find the closest
3%       values to X in vector Y with tolerance TOL. If TOL  is omitted, the
4%   default  value of 1e-6 will be used. CAUTION: Using too small tolerance may
5%   exclude some points from results (run example below with tol=0.005)
6%   BRO=0 by default and can also be omitted
7%   If BRO=0, then all indices of values of Y within the tolerance TOL vill be
8%   included in the output. If BRO=1 then one (last or first) value within each range
9%   will be reported.  If BRO>1 then one minimum value for each range
10%   will be included in output. Value of BRO defines indices range for
11%   minimum matching value search (rule of thumb- the coarser your TOL
12%   the bigger BRO should be. Use BRO= twice the maximum number of
13%   matching values for each matching point)
14%   (Run example below with a=match(val,y,tol, 1);
15%   and tol=0.01; to compare outputs)
16%       For example:
17%       xx=0:0.01:35; y=sin(xx) + cos(xx ./3);
18%       plot(xx,y); grid; hold on;
19%       val=1.04; tol=0.05;
20%       a=match(val,y,tol); plot(xx(a),y(a),'r.');  % All matching values
21%   aa=match(val,y,tol,1);  plot(xx(aa),y(aa),'ms'); % Single value per range
22%   aaa=match(val,y,tol,20);  plot(xx(aaa),y(aaa),'go'); % Min value
23%
24%       see also LMIN,LMAX, LMAX_PW,  LMIN_PW
25
26%       Sergei Koptenko, Applied Acoustic Technologies, Toronto, Canada
27%   sergei.koptenko@sympatico.ca,  March/22/2003 
28
29        if (nargin<4),       bro=0;
30        else,    bro=round(bro);
31        end;            % set the default  broadness
32                if (nargin<3),   tol=1e-6;  bro=0;  % set the default  tolerance
33        end;           
34       
35 [rrow,ccol]=size(y);
36if  (ccol==1), y=y'; end
37[rrow,ccol]=size(y);
38if  (rrow>1) || (rrow+ccol==2), disp('ERR: Y must be a vector!'); indd=[]; return; end
39if ( x>max(y)) || (x< min(y) ),
40    disp('ERR: X is outside of range of Y!');
41    indd=[]; return;
42end
43
44indd= find(xor(((x+tol) >=y), ((x-tol)<=y)) ==0); %get all indices within the tolerance
45
46if bro>0,
47        difi= diff(indd);              % find index difference
48        fdif= find(~(difi-1));     % find neigbouring indices
49        ddff=indd(fdif);           % get neigbouring indices
50%----------remove neigbouring indices-------------------
51                                for k1=1:length(ddff),
52                    aa = find(~(indd - ddff(k1)));
53                    indd(aa)=0;
54                                end %k1
55        bb=sort(indd);
56        indd=bb(find(bb));
57%----------find closest value for each range-------------------
58                        if bro>1,
59                innd=1;
60                        for j3=1:length(indd),
61                               j4=indd(j3)-bro;
62                               j5=indd(j3)+bro;
63                               dj4=0;
64                                    if j4<1, dj4=-j4 +1;
65                                        j4=1;
66                                    end
67                                    if j5>ccol, j5=ccol;end
68                               [vv,innd(j3)] = min(abs( y(j4:j5) -x ));
69                               innd(j3)=innd(j3) + dj4;
70                         end %j3         
71                            indd=indd + innd - bro-1;
72             end
73end
74                          if ~isempty(indd),
75                          if indd(1)<1, indd(1)=1;  end
76                           if indd(end)>ccol, indd(end)=ccol; end
77                       end
78return
Note: See TracBrowser for help on using the repository browser.