* Bug 15841 fixed: intersect() now accepts sparse
[scilab.git] / scilab / modules / elementary_functions / tests / unit_tests / intersect.tst
1 // =============================================================================
2 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 // Copyright (C) ????-2008 - INRIA
4 // Copyright (C) 2020 - Samuel GOUGEON
5 //
6 //  This file is distributed under the same license as the Scilab package.
7 // =============================================================================
8
9 // <-- CLI SHELL MODE -->
10 // <-- NO CHECK REF -->
11
12 [v, ka, kb] = intersect([],[]);
13 assert_checkequal(v, []);
14 assert_checkequal(ka, []);
15 assert_checkequal(kb, []);
16
17 [v,ka,kb] = intersect([1 2],[3 4]);
18 assert_checkequal(v, []);
19 assert_checkequal(ka, []);
20 assert_checkequal(kb, []);
21
22
23 A = [ 1 8 4 5 2 1];
24 B = [ 9 7 4 2 1 4];
25
26 [v,ka,kb] = intersect(A,B);
27 assert_checkequal(A(ka), B(kb));
28 assert_checkequal(A(ka), v);
29 assert_checkequal(intersect(A,B), v);
30 assert_checkequal(v, [1 2 4]);
31
32 // With texts
33 // ----------
34 A = 'a'+string(A);
35 B = 'b'+string(B);
36 [v,ka,kb] = intersect(A,B);
37 if or(A(ka) <> B(kb)) then pause,end
38 if or(A(ka) <> v) then pause,end
39 if or(v<>intersect(A,B))  then pause,end
40 if v <> [] then pause,end
41
42
43 A = [ "elt1" "elt3" "elt4"];
44 B = [ "elt5" "elt1" "elt3"];
45 [v, ka, kb] = intersect(A,B);
46 assert_checkequal(A(ka), B(kb));
47 assert_checkequal(A(ka), v);
48 assert_checkequal(intersect(A,B), v);
49 assert_checkequal(v, ["elt1","elt3"]);
50
51
52 A = [ "elt1" "elt3" "elt4"];
53 B = [ "elt5" "elt6" "elt2" "elt1" "elt3"];
54
55 [v, ka, kb] = intersect(A,B);
56 assert_checkequal(A(ka), B(kb));
57 assert_checkequal(A(ka), v);
58 assert_checkequal(intersect(A,B), v);
59 assert_checkequal(v, ["elt1","elt3"]);
60
61 // UTF-8
62 A = strsplit("هو برنامج علمي كبير ""Scilab""")'
63 B = strsplit("فهو حر ومفتوح")'
64 assert_checkequal(intersect(A,B),[" "  "ر"  "م"  "ه"  "و"]);
65
66 // With booleans
67 // -------------
68 [T, F] = (%t, %f);
69 assert_checkequal(intersect([F F],F), F);
70 assert_checkequal(intersect([T T],T), T);
71 assert_checkequal(intersect(T,F), []);
72 assert_checkequal(intersect(F,T), []);
73 A = [F F T F T F
74      T F F T T T
75      T T F T F F ];
76 B = [F T F T F F
77      T F F F T F
78      F T F F T F ];
79 ref = [F F T
80        T T F
81        F T F ];
82 assert_checkequal(intersect(A,B), [F T]);
83 assert_checkequal(intersect(A,B,"c"), ref);
84 [v,ka,kb] = intersect(A,B,"c");
85 assert_checkequal(v, ref);
86 assert_checkequal(A(:,ka), v);
87 assert_checkequal(A(:,ka), B(:,kb));
88
89 assert_checkequal(intersect(A',B',"r"), ref');
90 [v,ka,kb] = intersect(A',B',"r");
91 assert_checkequal(v, ref');
92 assert_checkequal(A(:,ka)', v);
93 assert_checkequal(A(:,ka)', B(:,kb)');
94
95
96 // with integers
97 // ------------
98 A = int16([1 8 4 5 2 1]);
99 B = int16([9 7 4 2 1 4]);
100
101 [v, ka, kb]=intersect(A,B);
102 assert_checkequal(A(ka), B(kb));
103 assert_checkequal(A(ka), v);
104 assert_checkequal(intersect(A,B), v);
105 assert_checkequal(v, int16([1,2,4]));
106
107 A = uint8([1 8 4 5 2 1]);
108 B = uint8([9 7 4 2 1 4]);
109
110 [v, ka, kb]=intersect(A,B);
111 assert_checkequal(A(ka), B(kb));
112 assert_checkequal(A(ka), v);
113 assert_checkequal(intersect(A,B), v);
114 assert_checkequal(v, uint8([1,2,4]));
115
116 // With orientation: Common rows or columns
117 // ----------------------------------------
118 A = [0,0,1,1 1;
119       0,1,1,1,1;
120       2,0,1,1,1;
121       0,2,2,2,2;
122       2,0,1,1,1;
123       0,0,1,1,3];
124 B = [1,0,1;
125      1,0,2;
126      1,2,3;
127      2,0,4;
128      1,2,5;
129      3,0,6];
130 [v, ka, kb] = intersect(A,B,'c');
131 assert_checkequal(v, A(:,ka));
132 assert_checkequal(A(:,ka), B(:,kb));
133 assert_checkequal(intersect(A,B,'c'), v);
134 assert_checkequal(v, [0,1;0,1;2,1;0,2;2,1;0,3]);
135
136 A = A'; B = B';
137 [v, ka, kb] = intersect(A, B, 'r');
138 assert_checkequal(v, A(ka,:));
139 assert_checkequal(A(ka,:), B(kb,:));
140 assert_checkequal(intersect(A,B,'r'), v);
141 assert_checkequal(v, [0,1;0,1;2,1;0,2;2,1;0,3]');
142
143 A32 = uint32(A);
144 B32 = uint32(B);
145 [v, ka, kb] = intersect(A32, B32, 'r');
146 assert_checkequal(v, A32(ka,:));
147 assert_checkequal(A32(ka,:), B32(kb,:));
148 assert_checkequal(intersect(A32,B32,'r'), v);
149 assert_checkequal(v, uint32([0,1;0,1;2,1;0,2;2,1;0,3]'));
150
151 // with Nan
152 // --------
153 assert_checkequal(intersect(%nan,%nan), []);
154 assert_checkequal(intersect([1 -2 %nan 3 6], [%nan 1:3]), [1 3]);
155
156 [A, B] = (A.', B.');
157 A($) = %nan;
158 B(6,1) = %nan;
159 [v,ka,kb] = intersect(A,B,'c');
160 assert_checkequal(v, A(:,ka));
161 assert_checkequal(A(:,ka), B(:,kb));
162 assert_checkequal(intersect(A,B,'c'), v);
163 assert_checkequal(v, [0;0;2;0;2;0]);
164
165 // With complex numbers
166 // --------------------
167 m = [
168   "[1+%i,1+%i,1,0,0,%i,1,1,1,0,1+%i,0,%i,%i,%i,1+%i,1+%i,0,1,1,1,0,0,%i;"
169   "1,0,%i,0,%i,1,1,0,%i,1,0,0,1,1,1+%i,1,1,%i,1+%i,%i,1,0,1+%i,0]"
170   ];
171 m = evstr(m).';
172 m1 = m(1:$/2,:);
173 m2 = m($/2+1:$,:);
174 /*         m1           row#           m2
175    1. + i     1. + 0.i    1    0. + i     1. + 0.i
176    1. + i     0. + 0.i    2    0. + i     1. + 0.i
177    1. + 0.i   0. + i      3    0. + i     1. + i
178    0. + 0.i   0. + 0.i    4    1. + i     1. + 0.i
179    0. + 0.i   0. + i      5    1. + i     1. + 0.i
180    0. + i     1. + 0.i    6    0. + 0.i   0. + i
181    1. + 0.i   1. + 0.i    7    1. + 0.i   1. + i
182    1. + 0.i   0. + 0.i    8    1. + 0.i   0. + i
183    1. + 0.i   0. + i      9    1. + 0.i   1. + 0.i
184    0. + 0.i   1. + 0.i   10    0. + 0.i   0. + 0.i
185    1. + i     0. + 0.i   11    0. + 0.i   1. + i
186    0. + 0.i   0. + 0.i   12    0. + i     0. + 0.i
187 */
188 // by element
189 [x, y] = (m1(1:6,1), m2(1:6,2));
190 i = intersect(x, y);
191 ref = [1 %i 1+%i];
192
193 assert_checkequal(i, ref);
194 [i, k1, k2] = intersect(x, y);
195 assert_checkequal(i, ref);
196 assert_checkequal(i, x(k1).');
197 assert_checkequal(i, y(k2).');
198 assert_checkequal(k1, [3 6 1]);
199 assert_checkequal(k2, [1 6 3]);
200
201 // "r": common rows
202 i = intersect(m1,m2,"r");
203 ref = evstr(["[0,0,1,1,%i,1+%i;";"0,%i,1,%i,1,1]"]).';
204 /*
205    0. + 0.i   0. + 0.i
206    0. + 0.i   0. + i
207    1. + 0.i   1. + 0.i
208    1. + 0.i   0. + i
209    0. + i     1. + 0.i
210    1. + i     1. + 0.i
211 */
212 assert_checkequal(i, ref);
213 [i, k1, k2] = intersect(m1,m2,"r");
214 assert_checkequal(i, ref);
215 assert_checkequal(i, m1(k1,:));
216 assert_checkequal(i, m2(k2,:));
217 assert_checkequal(k1, [4  5  7  3  6  1]);
218 assert_checkequal(k2, [10 6  9  8  1  4]);
219
220 // "c": common columns
221 [m1, m2, ref] = (m1.', m2.', ref.');
222 i = intersect(m1, m2, "c");
223 assert_checkequal(i, ref);
224 [i, k1, k2] = intersect(m1, m2, "c");
225 assert_checkequal(i, ref);
226 assert_checkequal(i, m1(:,k1));
227 assert_checkequal(i, m2(:,k2));
228 assert_checkequal(k1, [4  5  7  3  6  1]);
229 assert_checkequal(k2, [10 6  9  8  1  4]);