-
Notifications
You must be signed in to change notification settings - Fork 0
/
get_closest.pro
61 lines (52 loc) · 1.9 KB
/
get_closest.pro
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
;+
; NAME:
; get_closest
; PURPOSE:
; for each element of the reference vector, search in vector vec for its
; closest value. Returns a vector of indices.
; CATEGORY:
; CALLING SEQUENCE:
; index = get_closest(vec,ref)
; INPUTS:
; vec = vector to be searched.
; ref = reference vector
; OUTPUTS:
; index = index pointing to vec for each element of ref.
; KEYWORDS:
; out_of_range = flags points where the reference vector is outside of range
; of search vector.
; 1 if reference vector value is greater than maximum value of search vector
; -1 if reference vector value is less than minimum value of search vector
; 0 if reference vector value is within limits of search vector
;
; COMMON BLOCKS:
; None.
; SIDE EFFECTS:
; RESTRICTIONS:
; If more than one index in the search vector matches an element of
; reference vector, then only the first/lowest matching index
; will be returned.
; PROCEDURE:
; MODIFICATION HISTORY:
; Jean-Pierre Wuelser, many years ago in 1992-ish
; KPR - 2019, cleaned up, took out date processing options
;-
function get_closest, vec0, ref0, out_of_range=out_of_range
;vec0 = reform(array(vec0))
;ref0 = reform(array(ref0))
vec0 = reform(vec0)
ref0 = reform(ref0)
svec = size(vec0)
sref = size(ref0)
index = long(ref0) ; array with same size and shape as ref0, but type long
out_of_range = FIX(ref0) * 0 ; array with same size and shape as ref0, but type integer
vec0_min = MIN(vec0, max=vec0_max)
for i=0LL,n_elements(ref0)-1 do begin
IF ref0(i) LT vec0_min THEN out_of_range[i] = -1
IF ref0(i) GT vec0_max THEN out_of_range[i] = 1
delt = abs(vec0 - ref0[i])
dmin = where(delt eq min(delt))
index[i] = dmin[0]
endfor
return,index
end