* Bug 15734 fixed: intersect() dit not support complex numbers
[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 if or(A(ka) <> B(kb)) then pause,end
28 if or(A(ka) <> v) then pause,end
29 if or(v<>intersect(A,B))  then pause,end
30 if (or(v<>[1,2,4])) then pause,end
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 if or(A(ka) <> B(kb)) then pause,end
47 if or(A(ka) <> v) then pause,end
48 if or(v<>intersect(A,B))  then pause,end
49 if (or(v<>["elt1","elt3"])) then pause,end
50
51 A = [ "elt1" "elt3" "elt4"];
52 B = [ "elt5" "elt6" "elt2" "elt1" "elt3"];
53
54 [v, ka, kb] = intersect(A,B);
55 if or(A(ka) <> B(kb)) then pause,end
56 if or(A(ka) <> v) then pause,end
57 if or(v<>intersect(A,B))  then pause,end
58 if (or(v<>["elt1","elt3"])) then pause,end
59
60 // UTF-8
61 A = strsplit("هو برنامج علمي كبير ""Scilab""")'
62 B = strsplit("فهو حر ومفتوح")'
63 assert_checkequal(intersect(A,B),[" "  "ر"  "م"  "ه"  "و"]);
64
65 // with integers
66 // ------------
67 A = int16([ 1 8 4 5 2 1]);
68 B = int16([ 9 7 4 2 1 4]);
69
70 [v, ka, kb]=intersect(A,B);
71 if or(A(ka) <> B(kb)) then pause,end
72 if or(A(ka) <> v) then pause,end
73 if or(v<>intersect(A,B))  then pause,end
74 if (or(v<>int16([1,2,4]))) then pause,end
75
76 A = uint8([ 1 8 4 5 2 1]);
77 B = uint8([ 9 7 4 2 1 4]);
78
79 [v, ka, kb]=intersect(A,B);
80 if or(A(ka) <> B(kb)) then pause,end
81 if or(A(ka) <> v) then pause,end
82 if or(v<>intersect(A,B))  then pause,end
83 if (or(v<>uint8([1,2,4]))) then pause,end
84
85 // With orientation: Common rows or columns
86 // ----------------------------------------
87 A = [0,0,1,1 1;
88       0,1,1,1,1;
89       2,0,1,1,1;
90       0,2,2,2,2;
91       2,0,1,1,1;
92       0,0,1,1,3];
93 B = [1,0,1;
94      1,0,2;
95      1,2,3;
96      2,0,4;
97      1,2,5;
98      3,0,6];
99 [v, ka, kb] = intersect(A,B,'c');
100 assert_checkequal(v, A(:,ka));
101 assert_checkequal(A(:,ka), B(:,kb));
102 assert_checkequal(intersect(A,B,'c'), v);
103 assert_checkequal(v, [0,1;0,1;2,1;0,2;2,1;0,3]);
104
105 A = A'; B = B';
106 [v, ka, kb] = intersect(A, B, 'r');
107 assert_checkequal(v, A(ka,:));
108 assert_checkequal(A(ka,:), B(kb,:));
109 assert_checkequal(intersect(A,B,'r'), v);
110 assert_checkequal(v, [0,1;0,1;2,1;0,2;2,1;0,3]');
111
112 A32 = uint32(A);
113 B32 = uint32(B);
114 [v, ka, kb] = intersect(A32, B32, 'r');
115 assert_checkequal(v, A32(ka,:));
116 assert_checkequal(A32(ka,:), B32(kb,:));
117 assert_checkequal(intersect(A32,B32,'r'), v);
118 assert_checkequal(v, uint32([0,1;0,1;2,1;0,2;2,1;0,3]'));
119
120 // with Nan
121 // --------
122 assert_checkequal(intersect(%nan,%nan), []);
123 assert_checkequal(intersect([1 -2 %nan 3 6], [%nan 1:3]), [1 3]);
124
125 [A, B] = (A.', B.');
126 A($) = %nan;
127 B(6,1) = %nan;
128 [v,ka,kb] = intersect(A,B,'c');
129 assert_checkequal(v, A(:,ka));
130 assert_checkequal(A(:,ka), B(:,kb));
131 assert_checkequal(intersect(A,B,'c'), v);
132 assert_checkequal(v, [0;0;2;0;2;0]);
133
134 // With complex numbers
135 // --------------------
136 m = [
137   "[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;"
138   "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]"
139   ];
140 m = evstr(m).';
141 m1 = m(1:$/2,:);
142 m2 = m($/2+1:$,:);
143 /*         m1           row#           m2
144    1. + i     1. + 0.i    1    0. + i     1. + 0.i
145    1. + i     0. + 0.i    2    0. + i     1. + 0.i
146    1. + 0.i   0. + i      3    0. + i     1. + i
147    0. + 0.i   0. + 0.i    4    1. + i     1. + 0.i
148    0. + 0.i   0. + i      5    1. + i     1. + 0.i
149    0. + i     1. + 0.i    6    0. + 0.i   0. + i
150    1. + 0.i   1. + 0.i    7    1. + 0.i   1. + i
151    1. + 0.i   0. + 0.i    8    1. + 0.i   0. + i
152    1. + 0.i   0. + i      9    1. + 0.i   1. + 0.i
153    0. + 0.i   1. + 0.i   10    0. + 0.i   0. + 0.i
154    1. + i     0. + 0.i   11    0. + 0.i   1. + i
155    0. + 0.i   0. + 0.i   12    0. + i     0. + 0.i
156 */
157 // by element
158 [x, y] = (m1(1:6,1), m2(1:6,2));
159 i = intersect(x, y);
160 ref = [1 %i 1+%i];
161
162 assert_checkequal(i, ref);
163 [i, k1, k2] = intersect(x, y);
164 assert_checkequal(i, ref);
165 assert_checkequal(i, x(k1).');
166 assert_checkequal(i, y(k2).');
167 assert_checkequal(k1, [3 6 1]);
168 assert_checkequal(k2, [1 6 3]);
169
170 // "r": common rows
171 i = intersect(m1,m2,"r");
172 ref = evstr(["[0,0,1,1,%i,1+%i;";"0,%i,1,%i,1,1]"]).';
173 /*
174    0. + 0.i   0. + 0.i
175    0. + 0.i   0. + i
176    1. + 0.i   1. + 0.i
177    1. + 0.i   0. + i
178    0. + i     1. + 0.i
179    1. + i     1. + 0.i
180 */
181 assert_checkequal(i, ref);
182 [i, k1, k2] = intersect(m1,m2,"r");
183 assert_checkequal(i, ref);
184 assert_checkequal(i, m1(k1,:));
185 assert_checkequal(i, m2(k2,:));
186 assert_checkequal(k1, [4  5  7  3  6  1]);
187 assert_checkequal(k2, [10 6  9  8  1  4]);
188
189 // "c": common columns
190 [m1, m2, ref] = (m1.', m2.', ref.');
191 i = intersect(m1, m2, "c");
192 assert_checkequal(i, ref);
193 [i, k1, k2] = intersect(m1, m2, "c");
194 assert_checkequal(i, ref);
195 assert_checkequal(i, m1(:,k1));
196 assert_checkequal(i, m2(:,k2));
197 assert_checkequal(k1, [4  5  7  3  6  1]);
198 assert_checkequal(k2, [10 6  9  8  1  4]);