* Bugs 16337 16455 fixed: [..,..,ku] = unique(..) implemented
[scilab.git] / scilab / modules / elementary_functions / tests / unit_tests / unique.tst
index 8d838b6..67c15d9 100644 (file)
@@ -1,6 +1,6 @@
 // =============================================================================
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) 2018-2019 - Samuel Gougeon
+// Copyright (C) 2018-2020 - Samuel Gougeon
 //
 //  This file is distributed under the same license as the Scilab package.
 // =============================================================================
 //
 // <-- CLI SHELL MODE -->
 // <-- NO CHECK REF -->
+// <-- ENGLISH IMPOSED -->
 
 // =====================
 // Checking output sizes
 // =====================
-// "*"
-[u,k,?,nb] = unique([]);
-assert_checkequal(u, []);
-assert_checkequal(k, []);
-assert_checkequal(nb,[]);
-[u,k,?,nb] = unique([1 4 5]);
-sref = [1 3];
-assert_checkequal(size(u), sref);
-assert_checkequal(size(k), sref);
-assert_checkequal(size(nb),sref);
-[u,k,?,nb] = unique([1 4 5]');
-sref = [3 1];
-assert_checkequal(size(u), sref);
-assert_checkequal(size(k), sref);
-assert_checkequal(size(nb),sref);
-[u,k,?,nb] = unique([1 3 4 ; 5 6 7]);
-sref = [6 1];
-assert_checkequal(size(u), sref);
-assert_checkequal(size(k), sref);
-assert_checkequal(size(nb),sref);
-[u,k,?,nb] = unique(rand(3,4,2));
-sref = [24 1];
-assert_checkequal(size(u), sref);
-assert_checkequal(size(k), sref);
-assert_checkequal(size(nb),sref);
-
-// "r"
-[u,k,?,nb] = unique([], "r");
-assert_checkequal(u, []);
-assert_checkequal(k, []);
-assert_checkequal(nb,[]);
-[u,k,?,nb] = unique([1 3 4 ; 5 6 7], "r");
-assert_checkequal(size(u), [2 3]);
-assert_checkequal(size(k), [2 1]);
-assert_checkequal(size(nb),[2 1]);
+objects = list([], 7, 1:5, (1:5)', [1 3 5 ; 2 4 6], matrix(1:12,[2 3 2]));
+for o = objects
+    [u,ki,ko,nb] = unique(o);
+    n = length(o);
+    if o==[], su = [0 0]; else su = [n 1]; end
+    if isrow(o), su = [1 n]; end
+    assert_checkequal(size(u), su);
+    assert_checkequal(size(ki), su);
+    assert_checkequal(size(ko), size(o));
+    assert_checkequal(size(nb), size(ki));
+end
+objects($) = null(); // Removing hypermat (excluded from "r" and "c" options)
+for o = objects
+    [u,ki,ko,nb] = unique(o, "r");
+    [nr, nc] = size(o);
+    if o==[], su = [0 0]; else su = [nr 1]; end
+    assert_checkequal(size(u),  size(o));
+    assert_checkequal(size(ki), su);
+    assert_checkequal(size(ko), su);
+    assert_checkequal(size(nb), size(ki));
+
+    [u,ki,ko,nb] = unique(o, "c");
+    [nr, nc] = size(o);
+    if o==[], su = [0 0]; else su = [1 nc]; end
+    assert_checkequal(size(u),  size(o));
+    assert_checkequal(size(ki), su);
+    assert_checkequal(size(ko), su);
+    assert_checkequal(size(nb), size(ki));
+end
 
-// "c"
-[u,k,?,nb] = unique([], "c");
-assert_checkequal(u,[]);
-assert_checkequal(k,[]);
-[u,k,?,nb] = unique([1 3 4 ; 5 6 7], "c");
-assert_checkequal(size(u), [2 3]);
-assert_checkequal(size(k), [1 3]);
-assert_checkequal(size(nb),[1 3]);
 
 // ====================
 // With decimal numbers
 // ====================
+// -----
+// EMPTY
+// -----
+// By element
+[u,ki,ko,nb] = unique([]);
+assert_checkequal(u, []);
+assert_checkequal(ki, []);
+assert_checkequal(ko, []);
+assert_checkequal(nb, []);
+// "r"
+[u,ki,ko,nb] = unique([], "r");
+assert_checkequal(u, []);
+assert_checkequal(ki, []);
+assert_checkequal(ko, []);
+assert_checkequal(nb, []);
+// "c"
+[u,ki,ko,nb] = unique([], "c");
+assert_checkequal(u, []);
+assert_checkequal(ki, []);
+assert_checkequal(ko, []);
+assert_checkequal(nb, []);
+
+// ---
+// ROW
+// ---
+x = [1 3 %nan 3 %inf 4 0 %nan 4 1];
+
+// By elements
+[u, ki, ko, nb] = unique(x);
+assert_checkequal(u, [0  1  3  4  %inf  %nan  %nan]);
+assert_checkequal(ki, [7  1  2  6  5  3  8]);
+assert_checkequal(x(ki), u);
+assert_checkequal(ko, [2  3  6  3  5  4  1  7  4  2]);
+assert_checkequal(u(ko), x);
+assert_checkequal(nb, [1  2  2  2  1  1  1]);
+// "r"
+[u,ki,ko,nb] = unique(x, "r");
+assert_checkequal(u, x);
+assert_checkequal(ki, 1);
+assert_checkequal(x(ki,:), u);
+assert_checkequal(ko, 1);
+assert_checkequal(u(ko,:), x);
+assert_checkequal(nb, 1);
+// "c"
+[u,ki,ko,nb] = unique(x, "c");
+assert_checkequal(u, [0  1  3  4  %inf  %nan  %nan]);
+assert_checkequal(ki, [7  1  2  6  5  3  8]);
+assert_checkequal(x(:,ki), u);
+assert_checkequal(ko, [2  3  6  3  5  4  1  7  4  2]);
+assert_checkequal(u(:,ko), x);
+assert_checkequal(nb, [1  2  2  2  1  1  1]);
+
+// ------
+// COLUMN
+// ------
+x = x';
+// By elements
+[u, ki, ko, nb] = unique(x);
+assert_checkequal(u, [0  1  3  4  %inf  %nan  %nan]');
+assert_checkequal(ki, [7  1  2  6  5  3  8]');
+assert_checkequal(x(ki), u);
+assert_checkequal(ko, [2  3  6  3  5  4  1  7  4  2]');
+assert_checkequal(u(ko), x);
+assert_checkequal(nb, [1  2  2  2  1  1  1]');
+// "r"
+[u,ki,ko,nb] = unique(x, "r");
+assert_checkequal(u, [0  1  3  4  %inf  %nan  %nan]');
+assert_checkequal(ki, [7  1  2  6  5  3  8]');
+assert_checkequal(x(ki,:), u);
+assert_checkequal(ko, [2  3  6  3  5  4  1  7  4  2]');
+assert_checkequal(u(ko,:), x);
+assert_checkequal(nb, [1  2  2  2  1  1  1]');
+// "c"
+[u,ki,ko,nb] = unique(x, "c");
+assert_checkequal(u, x);
+assert_checkequal(ki, 1);
+assert_checkequal(x(:,ki), u);
+assert_checkequal(ko, 1);
+assert_checkequal(u(:,ko), x);
+assert_checkequal(nb, 1);
+
+// ------
+// MATRIX
+// ------
 x = [ 2  0  2  2  2  0  0  0  2  0  0  2  2  1  0  1
       1  2  2  2  1  0  2  2  0  0  1  0  1  1  0  0
     ];
 u = unique(x);
 assert_checkequal(u, [0 1 2]');
-[u,k,?,nb] = unique(x);
+[u,ki,ko,nb] = unique(x);
 assert_checkequal(u, [0 1 2]');
-assert_checkequal(k, [3 2 1]');
+assert_checkequal(ki, [3 2 1]');
+assert_checkequal(ko, x+1);
+assert_checkequal(u(ko), x);
 assert_checkequal(nb,[13 7 12]');
-
+// "c"
 u = unique(x, "c");
 uxc = [ 0  0  0  1  1  2  2  2
         0  1  2  0  1  0  1  2
       ];
 assert_checkequal(u, uxc);
-[u,k,?,nb] = unique(x, "c");
+[u,ki,ko,nb] = unique(x, "c");
 assert_checkequal(u, uxc);
-assert_checkequal(k, [6  11  2  16  14  9  1  3]);
-assert_checkequal(nb,[3  1   3  1   1   2  3  2]);
-
-u = unique(x', "r");
-assert_checkequal(u, uxc');
-[u,k,?,nb] = unique(x', "r");
-assert_checkequal(u, uxc');
-assert_checkequal(k, [6  11  2  16  14  9  1  3]');
-assert_checkequal(nb,[3  1   3  1   1   2  3  2]');
+assert_checkequal(ki, [6  11  2  16  14  9  1  3]);
+assert_checkequal(x(:,ki), u);
+assert_checkequal(ko, [7 3 8 8 7 1 3 3 6 1 2 6 7 5 1 4]);
+assert_checkequal(u(:,ko), x);
+assert_checkequal(nb, [3  1  3  1  1  2  3  2]);
+// "r"
+x = x';
+u = unique(x, "r");
+uxc = [ 0  0  0  1  1  2  2  2
+        0  1  2  0  1  0  1  2
+      ]';
+assert_checkequal(u, uxc);
+[u,ki,ko,nb] = unique(x, "r");
+assert_checkequal(u, uxc);
+assert_checkequal(ki, [6  11  2  16  14  9  1  3]');
+assert_checkequal(x(ki,:), u);
+assert_checkequal(ko, [7 3 8 8 7 1 3 3 6 1 2 6 7 5 1 4]');
+assert_checkequal(u(ko,:), x);
+assert_checkequal(nb, [3  1  3  1  1  2  3  2]');
+
+// -----------
+// HYPERMATRIX
+// -----------
+x = cat(3,[2 0 %nan 1 ; 2 1 0 2], [%inf 2 1 2 ; 1 0 %nan 2]);
+[u,ki,ko,nb] = unique(x);
+assert_checkequal(u, [0 1 2 %inf %nan %nan]');
+assert_checkequal(ki, [3  4  1  9  5  14]');
+assert_checkequal(u(ko), x);
+assert_checkequal(nb, [3  4  6  1  1  1]');
+msg = "unique: Argument #2: ''r'' not allowed for an hypermatrix.";
+assert_checkerror("unique(x, ""r"")", msg);
+msg = "unique: Argument #2: ''c'' not allowed for an hypermatrix.";
+assert_checkerror("unique(x, ""c"")", msg);
 
+// ---------
 // keepOrder
 // ---------
-[u,k,?,nb] = unique(x, "keepOrder");
+x = [ 2  0  2  2  2  0  0  0  2  0  0  2  2  1  0  1
+      1  2  2  2  1  0  2  2  0  0  1  0  1  1  0  0
+    ];
+[u,ki,ko,nb] = unique(x, "keepOrder");
 assert_checkequal(u, [2 1 0]');
-assert_checkequal(k, [1 2 3]');
+assert_checkequal(ki, [1 2 3]');
+assert_checkequal(x(ki), u);
+assert_checkequal(u(ko), x);
 assert_checkequal(nb,[12 7 13]');
 
-[u,k,?,nb] = unique(x, "c", "keepOrder");
 uxc = [2  0  2  0  2  0  1  1
        1  2  2  0  0  1  1  0
       ];
+// "r"
+[u,ki,ko,nb] = unique(x', "r", "keepOrder");
+assert_checkequal(u, uxc');
+assert_checkequal(ki, [1  2  3  6  9  11 14 16]');
+assert_checkequal(x'(ki,:), u);
+assert_checkequal(u(ko,:), x');
+assert_checkequal(nb, [3  3  2  3  2  1  1  1 ]');
+// "c"
+[u,ki,ko,nb] = unique(x, "c", "keepOrder");
 assert_checkequal(u, uxc);
-assert_checkequal(k, [1  2  3  6  9  11 14 16]);
-assert_checkequal(nb,[3  3  2  3  2  1  1  1 ]);
+assert_checkequal(ki, [1  2  3  6  9  11 14 16]);
+assert_checkequal(x(:,ki), u);
+assert_checkequal(u(:,ko), x);
+assert_checkequal(nb, [3  3  2  3  2  1  1  1 ]);
 
-[u,k,?,nb] = unique(x', "r", "keepOrder");
-assert_checkequal(u, uxc');
-assert_checkequal(k, [1  2  3  6  9  11 14 16]');
-assert_checkequal(nb,[3  3  2  3  2  1  1  1 ]');
 
-// With Nans
-// ---------
+// --------------
+// More with Nans
+// --------------
 Nan = %nan; Inf = %inf;
 x = [Nan  Nan  Inf  Nan  0  Inf  Inf  Nan  Inf  Nan
      Inf  0    Nan  0    0  0    Nan  Nan  0    0
     ];
 u = unique(x);
 assert_checkequal(u, [0 Inf Nan*ones(1,8)]');
-[u,k,?,nb] = unique(x);
+[u,ki,ko,nb] = unique(x);
 assert_checkequal(u, [0 Inf Nan*ones(1,8)]');
-assert_checkequal(k, [4 2 1 3 6 7 14 15 16 19]');
+assert_checkequal(ki, [4 2 1 3 6 7 14 15 16 19]');
+assert_checkequal(x(ki), u);
+assert_checkequal(u(ko), x);
 assert_checkequal(nb,[7 5 1 1 1 1 1  1  1  1]');
 //
 u = unique(x, "c");
@@ -125,43 +237,55 @@ uxc = [0  Inf  Inf  Inf  Nan  Nan  Nan  Nan  Nan
        0  0    Nan  Nan  0    0    0    Inf  Nan
       ];
 assert_checkequal(u, uxc);
-[u,k,?,nb] = unique(x, "c");
+[u,ki,ko,nb] = unique(x, "c");
 assert_checkequal(u, uxc);
-assert_checkequal(k, [5  6  3  7  2  4 10  1  8]);
+assert_checkequal(ki, [5  6  3  7  2  4 10  1  8]);
+assert_checkequal(x(:,ki), u);
+assert_checkequal(u(:,ko), x);
 assert_checkequal(nb,[1  2  1  1  1  1  1  1  1]);
 
 u = unique(x', "r");
 assert_checkequal(u, uxc');
-[u,k,?,nb] = unique(x', "r");
+[u,ki,ko,nb] = unique(x', "r");
 assert_checkequal(u, uxc');
-assert_checkequal(k, [5  6  3  7  2  4 10  1  8]');
+assert_checkequal(ki, [5  6  3  7  2  4 10  1  8]');
+assert_checkequal(x'(ki,:), u);
+assert_checkequal(u(ko,:), x');
 assert_checkequal(nb,[1  2  1  1  1  1  1  1  1]');
 
 // With Nans & "uniqueNan" option
 // ------------------------------
-[u,k,?,nb] = unique(x, "uniqueNan");
+[u,ki,ko,nb] = unique(x, "uniqueNan");
 assert_checkequal(u, [0 Inf Nan]');
-assert_checkequal(k, [4 2 1]');
+assert_checkequal(ki, [4 2 1]');
+assert_checkequal(x(ki), u);
+assert_checkequal(u(ko), x);
 assert_checkequal(nb,[7 5 8]');
 //
 uxc = [0  Inf  Inf  Nan  Nan  Nan
        0  0    Nan  0    Inf  Nan
       ];
-[u,k,?,nb] = unique(x, "c", "uniqueNan");
+[u,ki,ko,nb] = unique(x, "c", "uniqueNan");
 assert_checkequal(u, uxc);
-assert_checkequal(k, [5  6  3  2  1  8]);
+assert_checkequal(ki, [5  6  3  2  1  8]);
+assert_checkequal(x(:,ki), u);
+assert_checkequal(u(:,ko), x);
 assert_checkequal(nb,[1  2  2  3  1  1]);
 
-[u,k,?,nb] = unique(x', "r", "uniqueNan");
+[u,ki,ko,nb] = unique(x', "r", "uniqueNan");
 assert_checkequal(u, uxc');
-assert_checkequal(k, [5  6  3  2  1  8]');
+assert_checkequal(ki, [5  6  3  2  1  8]');
+assert_checkequal(x'(ki,:), u);
+assert_checkequal(u(ko,:), x');
 assert_checkequal(nb,[1  2  2  3  1  1]');
 
 // With Nans & "uniqueNan" & "keepOrder" options
 // ---------------------------------------------
-[u,k,?,nb] = unique(x, "uniqueNan", "keepOrder");
+[u,ki,ko,nb] = unique(x, "uniqueNan", "keepOrder");
 assert_checkequal(u, [Nan Inf 0]');
-assert_checkequal(k, [1 2 4]');
+assert_checkequal(ki, [1 2 4]');
+assert_checkequal(x(ki), u);
+assert_checkequal(u(ko), x);
 assert_checkequal(nb,[8 5 7]');
 //
 uxc = [Nan  Nan  Inf  0  Inf  Nan
@@ -169,14 +293,18 @@ uxc = [Nan  Nan  Inf  0  Inf  Nan
       ];
 //x = [Nan  Nan  Inf  Nan  0  Inf  Inf  Nan  Inf  Nan
 //     Inf  0    Nan  0    0  0    Nan  Nan  0    0
-[u,k,?,nb] = unique(x, "c", "uniqueNan", "keepOrder");
+[u,ki,ko,nb] = unique(x, "c", "uniqueNan", "keepOrder");
 assert_checkequal(u, uxc);
-assert_checkequal(k, [1  2  3  5  6  8]);
+assert_checkequal(ki, [1  2  3  5  6  8]);
+assert_checkequal(x(:,ki), u);
+assert_checkequal(u(:,ko), x);
 assert_checkequal(nb,[1  3  2  1  2  1]);
 
-[u,k,?,nb] = unique(x', "r", "uniqueNan", "keepOrder");
+[u,ki,ko,nb] = unique(x', "r", "uniqueNan", "keepOrder");
 assert_checkequal(u, uxc');
-assert_checkequal(k, [1  2  3  5  6  8]');
+assert_checkequal(ki, [1  2  3  5  6  8]');
+assert_checkequal(x'(ki,:), u);
+assert_checkequal(u(ko,:), x');
 assert_checkequal(nb,[1  3  2  1  2  1]');
 
 // =====================
@@ -188,72 +316,113 @@ x = int8([-3 0 2 0 -3
          ]);
 u = unique(x);
 assert_checkequal(u, int8([-3 0 2])');
-[u,k,?,nb] = unique(x);
+[u,ki,ko,nb] = unique(x);
 assert_checkequal(u, int8([-3 0 2])');
-assert_checkequal(k, [1 4 6]');
+assert_checkequal(ki, [1 4 6]');
+assert_checkequal(x(ki), u);
+assert_checkequal(u(ko), x);
 assert_checkequal(nb,[6 5 4]');
 
 u = unique(x, "r");
 assert_checkequal(u, int8([-3 0 2 0 -3 ; -3 2 0 2 -3]));
-[u,k,?,nb] = unique(x, "r");
+[u,ki,ko,nb] = unique(x, "r");
 assert_checkequal(u, int8([-3 0 2 0 -3 ; -3 2 0 2 -3]));
-assert_checkequal(k, [1;3]);
+assert_checkequal(ki, [1;3]);
+assert_checkequal(x(ki,:), u);
+assert_checkequal(u(ko,:), x);
 assert_checkequal(nb,[2;1]);
 
 u = unique(x, "c");
 assert_checkequal(u, int8([-3 0 2 ; -3 0 2; -3 2 0]));
-[u,k,?,nb] = unique(x, "c");
+[u,ki,ko,nb] = unique(x, "c");
 assert_checkequal(u, int8([-3 0 2 ; -3 0 2; -3 2 0]));
-assert_checkequal(k, [1 2 3]);
+assert_checkequal(ki, [1 2 3]);
+assert_checkequal(x(:,ki), u);
+assert_checkequal(u(:,ko), x);
 assert_checkequal(nb,[2 2 1]);
 
+// =============
+// With booleans
+// =============
+x = [%F %T %F %F %F %T %T
+     %F %T %T %F %T %F %F ];
+[u,ki,ko,nb] = unique(x);
+assert_checkequal(u, [%F ; %T]);
+assert_checkequal(ki, [1;3]);
+assert_checkequal(x(ki), u);
+assert_checkequal(u(ko), x);
+assert_checkequal(nb,[8;6]);
+
+[u,ki,ko,nb] = unique(x, "c");
+assert_checkequal(u, [%F %F %T %T ; %F %T %F %T]);
+assert_checkequal(ki, [1 3 6 2]);
+assert_checkequal(x(:,ki), u);
+assert_checkequal(u(:,ko), x);
+assert_checkequal(nb,[2 2 2 1]);
+
+
 
 // ====================
 // With complex numbers
 // ====================
 i = %i;
 x = [1-i, 3+2*i, 1+i, 3-2*i, 3+2*i, 3-i, 1-i];
-assert_checkequal(unique(x), [1-i, 1+i, 3-2*i, 3-i, 3+2*i]);
-[u,k,?,nb] = unique(x);
-assert_checkequal(u, [1-i, 1+i, 3-2*i, 3-i, 3+2*i]);
-assert_checkequal(k, [1  3  4  6  2]);
+assert_checkequal(unique(x), [1-i, 1+i, 3-i, 3-2*i, 3+2*i]);
+[u,ki,ko,nb] = unique(x);
+assert_checkequal(u, [1-i, 1+i, 3-i, 3-2*i, 3+2*i]);
+assert_checkequal(ki, [1  3  6  4  2]);
+assert_checkequal(x(ki), u);
+assert_checkequal(u(ko), x);
 assert_checkequal(nb,[2  1  1  1  2]);
 
 c = [x($:-1:1) ; x ; x($:-1:1) ; 1:7 ; x];
 u = unique(c, "r");
-assert_checkequal(u, c([4 2 1],:));
-[u,k,?,nb] = unique(c, "r");
-assert_checkequal(u, c([4 2 1],:));
-assert_checkequal(k, [4 2 1]');
+assert_checkequal(u, c([4 1 2],:));
+[u,ki,ko,nb] = unique(c, "r");
+assert_checkequal(u, c([4 1 2],:));
+assert_checkequal(ki, [4 1 2]');
+assert_checkequal(c(ki,:), u);
+assert_checkequal(u(ko,:), c);
 assert_checkequal(nb,[1 2 2]');
 
-u = unique(c', "c");
-kref = [4 2 1];
-assert_checkequal(u, c'(:,kref));
-[u,k,?,nb] = unique(c', "c");
-assert_checkequal(u, c'(:,kref));
-assert_checkequal(k, kref);
+c = c.';
+u = unique(c, "c");
+kref = [4 1 2];
+assert_checkequal(u, c(:,kref));
+[u,ki,ko,nb] = unique(c, "c");
+assert_checkequal(u, c(:,kref));
+assert_checkequal(ki, kref);
+assert_checkequal(c(:,ki), u);
+assert_checkequal(u(:,ko), c);
 assert_checkequal(nb,[1 2 2]);
 
+// ---------
 // keepOrder
 // ---------
-[u,k,?,nb] = unique(x, "keepOrder");
+// ROW
+[u,ki,ko,nb] = unique(x, "keepOrder");
 assert_checkequal(u, [1-i, 3+2*i, 1+i, 3-2*i, 3-i]);
-assert_checkequal(k, [1  2  3  4  6]);
+assert_checkequal(ki, [1  2  3  4  6]);
+assert_checkequal(x(ki), u);
+assert_checkequal(u(ko), x);
 assert_checkequal(nb,[2  2 1  1  1 ]);
 
 c = [x($:-1:1) ; x ; x($:-1:1) ; 1:7 ; x];
 kref = [1 2 4];
-[u,k,?,nb] = unique(c, "r", "keepOrder");
+[u,ki,ko,nb] = unique(c, "r", "keepOrder");
 assert_checkequal(u, c(kref,:));
-assert_checkequal(k, kref');
+assert_checkequal(ki, kref');
+assert_checkequal(c(ki,:), u);
+assert_checkequal(u(ko,:), c);
 assert_checkequal(nb,[2 2 1]');
 
-[u,k,?,nb] = unique(c', "c", "keepOrder");
-assert_checkequal(u, c'(:,kref));
-assert_checkequal(k, kref);
-assert_checkequal(nb,[2 2 1]);
-
+c = c.';
+[u,ki,ko,nb] = unique(c, "c", "keepOrder");
+assert_checkequal(u, c(:,kref));
+assert_checkequal(ki, kref);
+assert_checkequal(c(:,ki), u);
+assert_checkequal(u(:,ko), c);
+assert_checkequal(nb, [2 2 1]);
 
 // ==============
 // With some text
@@ -263,9 +432,11 @@ t = ["AB" "BA" "BA" "BA" "AB" "BA" "AB" "AB" "BB" "AA" "AB" "BA" "BA" "BA" "AA"
     ];
 u = unique(t);
 assert_checkequal(u, ["AA" "AB" "BA" "BB"]');
-[u,k,?,nb] = unique(t);
+[u,ki,ko,nb] = unique(t);
 assert_checkequal(u, ["AA" "AB" "BA" "BB"]');
-assert_checkequal(k, [2 1 3 10]');
+assert_checkequal(ki, [2 1 3 10]');
+assert_checkequal(t(ki), u);
+assert_checkequal(u(ko), t);
 assert_checkequal(nb,[6 10 8 6]');
 
 utc = ["AA"  "AA"  "AB"  "AB"  "AB"  "BA"  "BA"  "BA"  "BB"
@@ -273,34 +444,44 @@ utc = ["AA"  "AA"  "AB"  "AB"  "AB"  "BA"  "BA"  "BA"  "BB"
       ];
 u = unique(t, "c");
 assert_checkequal(u, utc);
-[u,k,?,nb] = unique(t, "c");
+[u,ki,ko,nb] = unique(t, "c");
 assert_checkequal(u, utc);
-assert_checkequal(k, [15 10 1 8 5 2 3 6 9]);
+assert_checkequal(ki, [15 10 1 8 5 2 3 6 9]);
+assert_checkequal(t(:,ki), u);
+assert_checkequal(u(:,ko), t);
 assert_checkequal(nb,[1  1  1 1 3 2 3 2 1]);
 
 u = unique(t', "r");
 assert_checkequal(u, utc');
-[u,k,?,nb] = unique(t', "r");
+[u,ki,ko,nb] = unique(t', "r");
 assert_checkequal(u, utc');
-assert_checkequal(k, [15 10 1 8 5 2 3 6 9]');
+assert_checkequal(ki, [15 10 1 8 5 2 3 6 9]');
+assert_checkequal(t'(ki,:), u);
+assert_checkequal(u(ko,:), t');
 assert_checkequal(nb,[1  1  1 1 3 2 3 2 1]');
 
 // keepOrder
 // ---------
-[u,k,?,nb] = unique(t, "keepOrder");
+[u,ki,ko,nb] = unique(t, "keepOrder");
 assert_checkequal(u, ["AB" "AA" "BA" "BB"]');
-assert_checkequal(k, [1 2 3 10]');
+assert_checkequal(ki, [1 2 3 10]');
+assert_checkequal(t(ki), u);
+assert_checkequal(u(ko), t);
 assert_checkequal(nb,[10 6 8 6]');
 
 utc = ["AB"  "BA"  "BA"  "AB"  "BA"  "AB"  "BB"  "AA"  "AA"
        "AA"  "AA"  "AB"  "BB"  "BB"  "BA"  "AB"  "AB"  "AA"
       ];
-[u,k,?,nb] = unique(t, "c", "keepOrder");
+[u,ki,ko,nb] = unique(t, "c", "keepOrder");
 assert_checkequal(u, utc);
-assert_checkequal(k, [1 2 3 5 6 8 9 10 15]);
+assert_checkequal(ki, [1 2 3 5 6 8 9 10 15]);
+assert_checkequal(t(:,ki), u);
+assert_checkequal(u(:,ko), t);
 assert_checkequal(nb,[1 2 3 3 2 1 1 1  1 ]);
 
-[u,k,?,nb] = unique(t', "r", "keepOrder");
+[u,ki,ko,nb] = unique(t', "r", "keepOrder");
 assert_checkequal(u, utc');
-assert_checkequal(k, [1 2 3 5 6 8 9 10 15]');
+assert_checkequal(ki, [1 2 3 5 6 8 9 10 15]');
+assert_checkequal(t'(ki,:), u);
+assert_checkequal(u(ko,:), t');
 assert_checkequal(nb,[1 2 3 3 2 1 1 1  1 ]');