* Bug 15967 fixed: setdiff(a,[],..) had troubles 75/20875/7
Samuel GOUGEON [Fri, 22 Feb 2019 00:04:52 +0000 (01:04 +0100)]
  http://bugzilla.scilab.org/15967

  The help page is already up to date.

Change-Id: I02082fce3b68f650c6a2d18db92257f7047db0ab

scilab/CHANGES.md
scilab/modules/elementary_functions/macros/setdiff.sci
scilab/modules/elementary_functions/tests/unit_tests/setdiff.tst

index c627c77..9657361 100644 (file)
@@ -259,6 +259,7 @@ Bug Fixes
 * [#15534](http://bugzilla.scilab.org/show_bug.cgi?id=15534): Booleans and encoded integers could not be concatenated together.
 >>>>>>> 7115870ad73... * Bug 15534 fixed: [%t int8(-5)] was refused
 * [#15577](http://bugzilla.scilab.org/show_bug.cgi?id=15577): `edit` did not accept a line number as text, as with `edit linspace 21`.
+<<<<<<< HEAD
 * [#15580](http://bugzilla.scilab.org/show_bug.cgi?id=15580): `det(sparse([],[]))` yielded an error.
 * [#15981](http://bugzilla.scilab.org/show_bug.cgi?id=15981): `wavread()` kept the wav file open and locked when returning on errors. It weakly managed the input file name. It claimed for invalid data formats instead of unsupported ones, with poor information about the current format vs the supported ones. Several error messages refered to a wrong function.
 * [#15595](http://bugzilla.scilab.org/show_bug.cgi?id=15595): `unique()` was not able to return distinct values in their original order, without sorting them. A `keepOrder` option now allows it.
@@ -275,6 +276,7 @@ Bug Fixes
 * [#15934](http://bugzilla.scilab.org/show_bug.cgi?id=15934): The `^ hat` page wrongly indicated that `^` applied to a rectangular matrix not being a vector is done element-wise.
 * [#15948](http://bugzilla.scilab.org/show_bug.cgi?id=15948): `xlabel`, `ylabel`, `zlabel` and `title` needed to be upgraded.
 * [#15964](http://bugzilla.scilab.org/show_bug.cgi?id=15954): A complex empty sparse matrix could be obtained after insertion.
+* [#15967](http://bugzilla.scilab.org/show_bug.cgi?id=15967): `setdiff(1,[])` was [] instead of `1`. `setdiff(a,[],..)` was not enough tested.
 * [#15969](http://bugzilla.scilab.org/show_bug.cgi?id=15969): Fix spelling
 * [#15974](http://bugzilla.scilab.org/show_bug.cgi?id=15974): `msprintf("%d", %nan)` did not return Nan
 * [#15977](http://bugzilla.scilab.org/show_bug.cgi?id=15977): The documentation for `wavread(..,'info')` had a mistake. The `wavread` page deserved some improvements.
@@ -357,3 +359,5 @@ Bug Fixes
 * [#16293](http://bugzilla.scilab.org/show_bug.cgi?id=16293): Some demos run in step-by-step console mode(4) did not focus user's attention to the console to proceed.
 * [#16299](http://bugzilla.scilab.org/show_bug.cgi?id=16299): After `graypolarplot`, `colorbar` displayed an empty ungraduated color bar.
 * [#16303](http://bugzilla.scilab.org/show_bug.cgi?id=16303): log10(x) had wrong dimensions when x is an hypermatrix.
+=======
+
index e7e8180..88fcb6d 100644 (file)
@@ -2,7 +2,7 @@
 // Copyright (C) INRIA
 // Copyright (C) DIGITEO - 2011 - Allan CORNET
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
-// Copyright (C) 2018 - Samuel GOUGEON
+// Copyright (C) 2018 - 2019 - Samuel GOUGEON
 //
 // This file is hereby licensed under the terms of the GNU GPL v2.0,
 // pursuant to article 5.3.4 of the CeCILL v.2.1.
@@ -26,7 +26,7 @@ function [a, ka] = setdiff(a, b, orien)
         error(msprintf(msg, "setdiff", 2, 3));
     end
     // Trivial case _whatever is b_
-    if a==[]
+    if isempty(a)
         ka = []
         return
     end
@@ -41,41 +41,36 @@ function [a, ka] = setdiff(a, b, orien)
     elseif orien=="r"
         orien = 1
     end
-    if orien==1 & size(a,2)~=size(b,2) then
+    if orien==1 & ~isempty(b) & size(a,2)~=size(b,2) then
         msg = _("%s: Arguments #%d and #%d: Same numbers of columns expected.\n")
         error(msprintf(msg, "setdiff", 1, 2))
     end
-    if orien==2 & size(a,1)~=size(b,1) then
+    if orien==2 & ~isempty(b) & size(a,1)~=size(b,1) then
         msg = _("%s: Arguments #%d and #%d: Same numbers of rows expected.\n")
         error(msprintf(msg, "setdiff", 1, 2))
     end
-    
+
     // PROCESSING
     // ==========
     // "r" or "c"
     // ----------
     if orien then
-        it = inttype(a)
-        if ndims(a)>2 then
+        if ndims(a) > 2 then
             a = serialize_hypermat(a, orien)
-        elseif orien==2
-            a = a.'
         end
-        // Trivial case
-        if b == [] then
-            ka = 1:size(a,orien);
-            if orien==1
-                ka = ka'
-            end
+        if ndims(b) > 2 then
+            b = serialize_hypermat(b, orien)
+        end
+        [a, ka] = unique(a, orien)
+        if isempty(b)
             return
         end
-        if ndims(b)>2 then
-            b = serialize_hypermat(b, orien)
-        elseif orien==2
+        it = inttype(a)
+        b = unique(b, orien)
+        if orien==2
+            a = a.'
             b = b.'
         end
-        [a, ka] = unique(a, "r")
-        b = unique(b, "r")
         [c, kc] = gsort([[a iconvert(ones(a(:,1)),it)] ;
                          [b iconvert(ones(b(:,1))*2,it)]], "lr","i")
         k = find(or(c(1:$-1,1:$-1)~=c(2:$,1:$-1),"c") & c(1:$-1,$)==1)
@@ -86,7 +81,7 @@ function [a, ka] = setdiff(a, b, orien)
         // a = a(ka,:) // in initial order
         a = c(k,1:$-1)
         if orien==2
-            ka = ka'
+            ka = matrix(ka, 1, -1)
             a = a.'
         end
     else
@@ -94,15 +89,18 @@ function [a, ka] = setdiff(a, b, orien)
         // ----------
         [a,ka] = unique(a);
         na = size(a,"*");
-    
+        if isempty(b)
+            return
+        end
+
         b = unique(b(:));
-    
+
         [x,k] = gsort([a(:); b], "g", "i");
         d = find(x(2:$)==x(1:$-1));  //index of common entries in sorted table
         if d <> [] then
             k([d;d+1]) = [];
         end
-    
+
         keep = find(k <= na);
         a = a(k(keep));
         ka = ka(k(keep));
@@ -114,6 +112,8 @@ function h = serialize_hypermat(h, orien)
         dims = 1:ndims(h)
         dims([1 2]) = [2 1]
         h = permute(h, dims)
+        h = matrix(h, size(h,1), -1).'
+    else
+        h = matrix(h, size(h,1), -1)
     end
-    h = matrix(h, size(h,1), -1).'
 endfunction
index 116b200..af354f4 100644 (file)
@@ -1,7 +1,7 @@
 // =============================================================================
 // Scilab ( http://wwwscilaborg/ ) - This file is part of Scilab
 // Copyright (C) 2009 - DIGITEO - Allan CORNET
-// Copyright (C) 2018 - Samuel GOUGEON
+// Copyright (C) 2018 - 2019 - Samuel GOUGEON
 //
 //  This file is distributed under the same license as the Scilab package
 // =============================================================================
@@ -47,8 +47,6 @@ h = cat(3, m(:,1:6), m2(:,1:6));
 h2 = cat(3, m([2 1],1:6), m2([2 1],1:6));
 L  = list(s,  r,  c,  m,  h);
 L2 = list(s2, r2, c2, m2, h2);
-msgr = "setdiff: Arguments #1 and #2: Same numbers of columns expected.";
-msgc = "setdiff: Arguments #1 and #2: Same numbers of rows expected.";
 
 // With a=[] , orien = none|"r"|"c"
 // --------------------------------
@@ -63,8 +61,32 @@ for i = 1:length(L)
     [va, ka] = setdiff([], o, "c");
     assert_checkequal(va, []);
     assert_checkequal(ka, []);
-    assert_checkerror("setdiff(o, [], ''r'')", msgr);
-    assert_checkerror("setdiff(o, [], ''c'')", msgc);
+end
+
+// With b=[] , orien = none|"r"|"c"
+// --------------------------------
+for i = 1:length(L)
+    o = L(i);
+    [va, ka] = setdiff(o,[]);
+    [var,kar]= unique(o);
+    assert_checkequal(va, var);
+    assert_checkequal(ka, kar);
+    if ndims(o)>2
+        [var,kar] = unique(matrix(permute(o,[2 1 3]),6,-1)', "r");
+    else
+        [var,kar] = unique(o, "r")
+    end
+    [va, ka] = setdiff(o, [], "r");
+    assert_checkequal(va, var);
+    assert_checkequal(ka, kar);
+    [va, ka] = setdiff(o, [], "c");
+    if ndims(o)>2
+        [var,kar] = unique(matrix(o,2,-1), "c");
+    else
+        [var,kar] = unique(o, "c")
+    end
+    assert_checkequal(va, var);
+    assert_checkequal(ka, kar);
 end
 
 // "r" and "c" options