8d838b6cb2e01333317fbab8d1a8efefec2ad5af
[scilab.git] / scilab / modules / elementary_functions / tests / unit_tests / unique.tst
1 // =============================================================================
2 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 // Copyright (C) 2018-2019 - Samuel Gougeon
4 //
5 //  This file is distributed under the same license as the Scilab package.
6 // =============================================================================
7 // unit test of unique()
8 //
9 // <-- CLI SHELL MODE -->
10 // <-- NO CHECK REF -->
11
12 // =====================
13 // Checking output sizes
14 // =====================
15 // "*"
16 [u,k,?,nb] = unique([]);
17 assert_checkequal(u, []);
18 assert_checkequal(k, []);
19 assert_checkequal(nb,[]);
20 [u,k,?,nb] = unique([1 4 5]);
21 sref = [1 3];
22 assert_checkequal(size(u), sref);
23 assert_checkequal(size(k), sref);
24 assert_checkequal(size(nb),sref);
25 [u,k,?,nb] = unique([1 4 5]');
26 sref = [3 1];
27 assert_checkequal(size(u), sref);
28 assert_checkequal(size(k), sref);
29 assert_checkequal(size(nb),sref);
30 [u,k,?,nb] = unique([1 3 4 ; 5 6 7]);
31 sref = [6 1];
32 assert_checkequal(size(u), sref);
33 assert_checkequal(size(k), sref);
34 assert_checkequal(size(nb),sref);
35 [u,k,?,nb] = unique(rand(3,4,2));
36 sref = [24 1];
37 assert_checkequal(size(u), sref);
38 assert_checkequal(size(k), sref);
39 assert_checkequal(size(nb),sref);
40
41 // "r"
42 [u,k,?,nb] = unique([], "r");
43 assert_checkequal(u, []);
44 assert_checkequal(k, []);
45 assert_checkequal(nb,[]);
46 [u,k,?,nb] = unique([1 3 4 ; 5 6 7], "r");
47 assert_checkequal(size(u), [2 3]);
48 assert_checkequal(size(k), [2 1]);
49 assert_checkequal(size(nb),[2 1]);
50
51 // "c"
52 [u,k,?,nb] = unique([], "c");
53 assert_checkequal(u,[]);
54 assert_checkequal(k,[]);
55 [u,k,?,nb] = unique([1 3 4 ; 5 6 7], "c");
56 assert_checkequal(size(u), [2 3]);
57 assert_checkequal(size(k), [1 3]);
58 assert_checkequal(size(nb),[1 3]);
59
60 // ====================
61 // With decimal numbers
62 // ====================
63 x = [ 2  0  2  2  2  0  0  0  2  0  0  2  2  1  0  1
64       1  2  2  2  1  0  2  2  0  0  1  0  1  1  0  0
65     ];
66 u = unique(x);
67 assert_checkequal(u, [0 1 2]');
68 [u,k,?,nb] = unique(x);
69 assert_checkequal(u, [0 1 2]');
70 assert_checkequal(k, [3 2 1]');
71 assert_checkequal(nb,[13 7 12]');
72
73 u = unique(x, "c");
74 uxc = [ 0  0  0  1  1  2  2  2
75         0  1  2  0  1  0  1  2
76       ];
77 assert_checkequal(u, uxc);
78 [u,k,?,nb] = unique(x, "c");
79 assert_checkequal(u, uxc);
80 assert_checkequal(k, [6  11  2  16  14  9  1  3]);
81 assert_checkequal(nb,[3  1   3  1   1   2  3  2]);
82
83 u = unique(x', "r");
84 assert_checkequal(u, uxc');
85 [u,k,?,nb] = unique(x', "r");
86 assert_checkequal(u, uxc');
87 assert_checkequal(k, [6  11  2  16  14  9  1  3]');
88 assert_checkequal(nb,[3  1   3  1   1   2  3  2]');
89
90 // keepOrder
91 // ---------
92 [u,k,?,nb] = unique(x, "keepOrder");
93 assert_checkequal(u, [2 1 0]');
94 assert_checkequal(k, [1 2 3]');
95 assert_checkequal(nb,[12 7 13]');
96
97 [u,k,?,nb] = unique(x, "c", "keepOrder");
98 uxc = [2  0  2  0  2  0  1  1
99        1  2  2  0  0  1  1  0
100       ];
101 assert_checkequal(u, uxc);
102 assert_checkequal(k, [1  2  3  6  9  11 14 16]);
103 assert_checkequal(nb,[3  3  2  3  2  1  1  1 ]);
104
105 [u,k,?,nb] = unique(x', "r", "keepOrder");
106 assert_checkequal(u, uxc');
107 assert_checkequal(k, [1  2  3  6  9  11 14 16]');
108 assert_checkequal(nb,[3  3  2  3  2  1  1  1 ]');
109
110 // With Nans
111 // ---------
112 Nan = %nan; Inf = %inf;
113 x = [Nan  Nan  Inf  Nan  0  Inf  Inf  Nan  Inf  Nan
114      Inf  0    Nan  0    0  0    Nan  Nan  0    0
115     ];
116 u = unique(x);
117 assert_checkequal(u, [0 Inf Nan*ones(1,8)]');
118 [u,k,?,nb] = unique(x);
119 assert_checkequal(u, [0 Inf Nan*ones(1,8)]');
120 assert_checkequal(k, [4 2 1 3 6 7 14 15 16 19]');
121 assert_checkequal(nb,[7 5 1 1 1 1 1  1  1  1]');
122 //
123 u = unique(x, "c");
124 uxc = [0  Inf  Inf  Inf  Nan  Nan  Nan  Nan  Nan
125        0  0    Nan  Nan  0    0    0    Inf  Nan
126       ];
127 assert_checkequal(u, uxc);
128 [u,k,?,nb] = unique(x, "c");
129 assert_checkequal(u, uxc);
130 assert_checkequal(k, [5  6  3  7  2  4 10  1  8]);
131 assert_checkequal(nb,[1  2  1  1  1  1  1  1  1]);
132
133 u = unique(x', "r");
134 assert_checkequal(u, uxc');
135 [u,k,?,nb] = unique(x', "r");
136 assert_checkequal(u, uxc');
137 assert_checkequal(k, [5  6  3  7  2  4 10  1  8]');
138 assert_checkequal(nb,[1  2  1  1  1  1  1  1  1]');
139
140 // With Nans & "uniqueNan" option
141 // ------------------------------
142 [u,k,?,nb] = unique(x, "uniqueNan");
143 assert_checkequal(u, [0 Inf Nan]');
144 assert_checkequal(k, [4 2 1]');
145 assert_checkequal(nb,[7 5 8]');
146 //
147 uxc = [0  Inf  Inf  Nan  Nan  Nan
148        0  0    Nan  0    Inf  Nan
149       ];
150 [u,k,?,nb] = unique(x, "c", "uniqueNan");
151 assert_checkequal(u, uxc);
152 assert_checkequal(k, [5  6  3  2  1  8]);
153 assert_checkequal(nb,[1  2  2  3  1  1]);
154
155 [u,k,?,nb] = unique(x', "r", "uniqueNan");
156 assert_checkequal(u, uxc');
157 assert_checkequal(k, [5  6  3  2  1  8]');
158 assert_checkequal(nb,[1  2  2  3  1  1]');
159
160 // With Nans & "uniqueNan" & "keepOrder" options
161 // ---------------------------------------------
162 [u,k,?,nb] = unique(x, "uniqueNan", "keepOrder");
163 assert_checkequal(u, [Nan Inf 0]');
164 assert_checkequal(k, [1 2 4]');
165 assert_checkequal(nb,[8 5 7]');
166 //
167 uxc = [Nan  Nan  Inf  0  Inf  Nan
168        Inf  0    Nan  0  0    Nan
169       ];
170 //x = [Nan  Nan  Inf  Nan  0  Inf  Inf  Nan  Inf  Nan
171 //     Inf  0    Nan  0    0  0    Nan  Nan  0    0
172 [u,k,?,nb] = unique(x, "c", "uniqueNan", "keepOrder");
173 assert_checkequal(u, uxc);
174 assert_checkequal(k, [1  2  3  5  6  8]);
175 assert_checkequal(nb,[1  3  2  1  2  1]);
176
177 [u,k,?,nb] = unique(x', "r", "uniqueNan", "keepOrder");
178 assert_checkequal(u, uxc');
179 assert_checkequal(k, [1  2  3  5  6  8]');
180 assert_checkequal(nb,[1  3  2  1  2  1]');
181
182 // =====================
183 // With encoded integers
184 // =====================
185 x = int8([-3 0 2 0 -3
186           -3 0 2 0 -3
187           -3 2 0 2 -3
188          ]);
189 u = unique(x);
190 assert_checkequal(u, int8([-3 0 2])');
191 [u,k,?,nb] = unique(x);
192 assert_checkequal(u, int8([-3 0 2])');
193 assert_checkequal(k, [1 4 6]');
194 assert_checkequal(nb,[6 5 4]');
195
196 u = unique(x, "r");
197 assert_checkequal(u, int8([-3 0 2 0 -3 ; -3 2 0 2 -3]));
198 [u,k,?,nb] = unique(x, "r");
199 assert_checkequal(u, int8([-3 0 2 0 -3 ; -3 2 0 2 -3]));
200 assert_checkequal(k, [1;3]);
201 assert_checkequal(nb,[2;1]);
202
203 u = unique(x, "c");
204 assert_checkequal(u, int8([-3 0 2 ; -3 0 2; -3 2 0]));
205 [u,k,?,nb] = unique(x, "c");
206 assert_checkequal(u, int8([-3 0 2 ; -3 0 2; -3 2 0]));
207 assert_checkequal(k, [1 2 3]);
208 assert_checkequal(nb,[2 2 1]);
209
210
211 // ====================
212 // With complex numbers
213 // ====================
214 i = %i;
215 x = [1-i, 3+2*i, 1+i, 3-2*i, 3+2*i, 3-i, 1-i];
216 assert_checkequal(unique(x), [1-i, 1+i, 3-2*i, 3-i, 3+2*i]);
217 [u,k,?,nb] = unique(x);
218 assert_checkequal(u, [1-i, 1+i, 3-2*i, 3-i, 3+2*i]);
219 assert_checkequal(k, [1  3  4  6  2]);
220 assert_checkequal(nb,[2  1  1  1  2]);
221
222 c = [x($:-1:1) ; x ; x($:-1:1) ; 1:7 ; x];
223 u = unique(c, "r");
224 assert_checkequal(u, c([4 2 1],:));
225 [u,k,?,nb] = unique(c, "r");
226 assert_checkequal(u, c([4 2 1],:));
227 assert_checkequal(k, [4 2 1]');
228 assert_checkequal(nb,[1 2 2]');
229
230 u = unique(c', "c");
231 kref = [4 2 1];
232 assert_checkequal(u, c'(:,kref));
233 [u,k,?,nb] = unique(c', "c");
234 assert_checkequal(u, c'(:,kref));
235 assert_checkequal(k, kref);
236 assert_checkequal(nb,[1 2 2]);
237
238 // keepOrder
239 // ---------
240 [u,k,?,nb] = unique(x, "keepOrder");
241 assert_checkequal(u, [1-i, 3+2*i, 1+i, 3-2*i, 3-i]);
242 assert_checkequal(k, [1  2  3  4  6]);
243 assert_checkequal(nb,[2  2 1  1  1 ]);
244
245 c = [x($:-1:1) ; x ; x($:-1:1) ; 1:7 ; x];
246 kref = [1 2 4];
247 [u,k,?,nb] = unique(c, "r", "keepOrder");
248 assert_checkequal(u, c(kref,:));
249 assert_checkequal(k, kref');
250 assert_checkequal(nb,[2 2 1]');
251
252 [u,k,?,nb] = unique(c', "c", "keepOrder");
253 assert_checkequal(u, c'(:,kref));
254 assert_checkequal(k, kref);
255 assert_checkequal(nb,[2 2 1]);
256
257
258 // ==============
259 // With some text
260 // ==============
261 t = ["AB" "BA" "BA" "BA" "AB" "BA" "AB" "AB" "BB" "AA" "AB" "BA" "BA" "BA" "AA"
262      "AA" "AA" "AB" "AA" "BB" "BB" "BB" "BA" "AB" "AB" "BB" "BB" "AB" "AB" "AA"
263     ];
264 u = unique(t);
265 assert_checkequal(u, ["AA" "AB" "BA" "BB"]');
266 [u,k,?,nb] = unique(t);
267 assert_checkequal(u, ["AA" "AB" "BA" "BB"]');
268 assert_checkequal(k, [2 1 3 10]');
269 assert_checkequal(nb,[6 10 8 6]');
270
271 utc = ["AA"  "AA"  "AB"  "AB"  "AB"  "BA"  "BA"  "BA"  "BB"
272        "AA"  "AB"  "AA"  "BA"  "BB"  "AA"  "AB"  "BB"  "AB"
273       ];
274 u = unique(t, "c");
275 assert_checkequal(u, utc);
276 [u,k,?,nb] = unique(t, "c");
277 assert_checkequal(u, utc);
278 assert_checkequal(k, [15 10 1 8 5 2 3 6 9]);
279 assert_checkequal(nb,[1  1  1 1 3 2 3 2 1]);
280
281 u = unique(t', "r");
282 assert_checkequal(u, utc');
283 [u,k,?,nb] = unique(t', "r");
284 assert_checkequal(u, utc');
285 assert_checkequal(k, [15 10 1 8 5 2 3 6 9]');
286 assert_checkequal(nb,[1  1  1 1 3 2 3 2 1]');
287
288 // keepOrder
289 // ---------
290 [u,k,?,nb] = unique(t, "keepOrder");
291 assert_checkequal(u, ["AB" "AA" "BA" "BB"]');
292 assert_checkequal(k, [1 2 3 10]');
293 assert_checkequal(nb,[10 6 8 6]');
294
295 utc = ["AB"  "BA"  "BA"  "AB"  "BA"  "AB"  "BB"  "AA"  "AA"
296        "AA"  "AA"  "AB"  "BB"  "BB"  "BA"  "AB"  "AB"  "AA"
297       ];
298 [u,k,?,nb] = unique(t, "c", "keepOrder");
299 assert_checkequal(u, utc);
300 assert_checkequal(k, [1 2 3 5 6 8 9 10 15]);
301 assert_checkequal(nb,[1 2 3 3 2 1 1 1  1 ]);
302
303 [u,k,?,nb] = unique(t', "r", "keepOrder");
304 assert_checkequal(u, utc');
305 assert_checkequal(k, [1 2 3 5 6 8 9 10 15]');
306 assert_checkequal(nb,[1 2 3 3 2 1 1 1  1 ]');