match2.pro
来自「basic median filter simulation」· PRO 代码 · 共 158 行
PRO
158 行
;+; NAME:; MATCH2; PURPOSE:; Routine to cross-match values in two vectors (including non-matches); EXPLANATION:; This procedure *appears* similar to MATCH of the IDL astronomy; library. However, this routine is quite different in that it; reports an index value for each element of the input arrays.; In other words, while MATCH reports the *existence* of; matching elements in each array, MATCH2 reports explicitly; *which* elements match.;; Furthermore, while MATCH reports only unique matching; elements, MATCH2 will always report a cross-match for every; element in each array, even if it is a repeat.;; In cases where no match was found, an index of -1 is; reported. ;; CALLING SEQUENCE:; match2, a, b, suba, subb;; INPUTS:; a,b - two vectors to match elements, numeric or string data types;; OUTPUTS:; suba - vector with same number of elements as A, such that; A EQ B[SUBA], except non-matches which are indicated; by SUBA EQ -1; subb - vector with same number of elements as B, such that; B EQ A[SUBB], except non-matches which are indicated; by SUBB EQ -1;;; RESTRICTIONS:; ; The vectors A and B are allowed to have duplicates in them,; but for matching purposes, only the first one found will; be reported.;; EXAMPLE:; A = [0,7,14,23,24,30]; B = [7,8,14,25,14]; IDL> match2, a, b, suba, subb; --> suba = [ -1 , 0, 4, -1, -1, -1 ]; (indicates that A[1] matches B[1] and A[3] matches B[2]); --> subb = [ 1 , -1, 2, -1, 2 ]; (indicates that B[1] matches A[1] and B[2] matches A[3]);; Compare to the results of the original MATCH procedure,; ; IDL> match, a, b, suba, subb; --> suba = [ 1, 3]; (indicates that A[1] and A[3] match elements in B, but not which ones); --> subb = [ 1, 2]; (indicates that B[1] and B[2] match elements in A, but not which ones);; MODIFICATION HISTORY; Derived from the IDL Astronomy Library MATCH, 14 Feb 2007; Updated documentation, 17 Jul 2007; More updated documentation (example), 03 Sep 2007; ;-;-------------------------------------------------------------------------pro match2, a, b, suba, subb On_error,2 compile_opt idl2 if N_params() LT 3 then begin print,'Syntax - match2, a, b, suba, subb' print,' a,b -- input vectors for which to match elements' print,' suba,subb -- match index lists' return endif da = size(a,/type) & db =size(b,/type) na = N_elements(a) ;number of elements in a nb = N_elements(b) ;number of elements in b suba = lonarr(na)-1 & subb = lonarr(nb)-1; Check for a single element array if (na EQ 1) or (nb EQ 1) then begin if (nb GT 1) then begin wh = where(b EQ a[0], nw) if nw GT 0 then begin subb[wh] = 0L suba[0] = wh[0] endif endif else begin wh = where(a EQ b[0], nw) if nw GT 0 then begin suba[wh] = 0L subb[0] = wh[0] endif endelse return endif c = [ a, b ] ;combined list of a and b ind = [ lindgen(na), lindgen(nb) ] ;combined list of indices vec = [ intarr(na), replicate(1,nb) ] ;flag of which vector in combined ;list 0 - a 1 - b; sort combined list if da EQ 7 OR db EQ 7 then begin ;; String sort (w/ double key) sub = sort(c+strtrim(vec,2)) endif else begin ;; Number sort (w/ double key) eps = (machar(/double)).eps sub = sort(double(c)*(1d + vec*eps)) endelse c = c[sub] ind = ind[sub] vec = vec[sub] n = na + nb ;total elements in c wh = where( c[1:*] NE c, ct) if ct EQ 0 then begin whfirst = [0] whlast = [n-1] endif else begin whfirst = [0, wh+1] whlast = [wh, n-1] endelse vec0 = vec[whfirst] vec1 = vec[whlast] ;; 0 = present in A but not B ;; 1 = can't occur (since the array was sorted on 'VEC') ;; 2 = present in both ;; 3 = present in B but not A matchtype = vec0 + vec1*2 nm = n_elements(matchtype) mm = ind*0L & wa = mm & wb = mm for i = 0, nm-1 do begin mm[whfirst[i]:whlast[i]] = matchtype[i] wa[whfirst[i]:whlast[i]] = ind[whfirst[i]] wb[whfirst[i]:whlast[i]] = ind[whlast[i]] endfor suba = lonarr(na)-1 & subb = lonarr(nb)-1 wh = where(mm EQ 2 AND vec EQ 0, ct) if ct GT 0 then suba[ind[wh]] = wb[wh] wh = where(mm EQ 2 AND vec EQ 1, ct) if ct GT 0 then subb[ind[wh]] = wa[wh] returnend
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?