source: trunk/SRC/Matrix/inter.pro @ 232

Last change on this file since 232 was 232, checked in by pinsard, 17 years ago

improvements/corrections of some *.pro headers

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 1.8 KB
Line 
1;+
2;
3; @file_comments
4; calculate the intersection between 2 matrices of whole numbers
5;
6; @categories
7; Calculation
8;
9; @param a {in}{required} arrays of positive integers, which need not to be
10; sorted. Duplicate elements are ignored, as they have no effect on the
11; result
12;
13; @param b {in}{required} see a
14;
15; @returns tableau
16;
17; @restrictions The empty set is denoted by an array with the first element equal to
18; -1.
19;
20; @restrictions These functions will not be efficient on sparse sets with wide
21; ranges, as they trade memory for efficiency. The HISTOGRAM function
22; is used, which creates arrays of size equal to the range of the
23; resulting set.
24;
25; @examples
26; IDL> a = [2,4,6,8]
27; IDL> b = [6,1,3,2]
28; IDL> inter(a,b) = [ 2, 6]       ; Common elements
29;
30; @history
31; <a href="http://www.dfanning.com/tips/set_operations.html"/>
32;
33; @version
34; $Id$
35;
36;-
37;
38FUNCTION inter, a, b
39;
40  compile_opt idl2, strictarrsubs
41;
42   case 1 of
43      n_elements(a) EQ 0:return,  -1
44      n_elements(b) EQ 0:return,  -1
45      n_elements(a) EQ 1 AND n_elements(b) NE 1: $
46       if (where(b EQ a[0]))[0] EQ -1 then return, -1 ELSE return,  a[0]
47      n_elements(b) EQ 1 AND n_elements(a) NE 1: $
48       if (where(a EQ b[0]))[0] EQ -1 then return, -1 ELSE return,  b[0]
49      n_elements(a) EQ 1 AND n_elements(b) EQ 1: $
50       if (where(a[0] EQ b[0]))[0] EQ -1 then return, -1 ELSE return,  a[0]
51      ELSE:
52   ENDCASE
53;
54minab = Min(a, Max=maxa) > Min(b, Max=maxb) ;Only need intersection of ranges
55maxab = maxa < maxb
56
57   ; If either set is empty, or their ranges don't intersect: result = NULL.
58
59IF maxab LT minab OR maxab LT 0 THEN RETURN, -1
60r = Where(Histogram(a, Min=minab, Max=maxab) $
61          *Histogram(b, Min=minab, Max=maxab), count)
62
63IF count EQ 0 THEN RETURN, -1 ELSE RETURN, r + minab
64END
Note: See TracBrowser for help on using the repository browser.