Bug #8101: The median function did not return the good result if the first argument... 05/8405/3
Adeline CARNIS [Mon, 30 Jul 2012 10:32:30 +0000 (12:32 +0200)]
Change-Id: I9d2fda7abc5c72f283f2cd4e2814e393debd6098

scilab/CHANGES_5.4.X
scilab/modules/elementary_functions/macros/%sp_gsort.sci
scilab/modules/statistics/macros/median.sci
scilab/modules/statistics/tests/nonreg_tests/bug_8101.dia.ref [new file with mode: 0644]
scilab/modules/statistics/tests/nonreg_tests/bug_8101.tst [new file with mode: 0644]

index 66bdf31..30ca80d 100644 (file)
@@ -168,6 +168,10 @@ Bug Fixes
 * Bug #7881 fixed - Error in the condition which must check if the second input
                     argument in the lattn function is or not scalar.
 
+* Bug #8101 fixed - The median function with a sparse as a first argument did not
+                    return the good result. Moreover, median(sparse, 'r'| 'c') was not
+                    managed.
+
 * Bug #8351 fixed - The integrate function did not manage properly the optional 
                     input arguments.
 
index a97509f..3c6b347 100644 (file)
@@ -1,27 +1,51 @@
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) DIGITEO - 2009 - Allan CORNET
-// 
-// This file must be used under the terms of the CeCILL.
-// This source file is licensed as described in the file COPYING, which
-// you should have received as part of this distribution.  The terms
-// are also available at    
-// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
-
-function A = %sp_gsort(A, optsort, directionsort)
-  [ij, v, mn] = spget(A);
-  if mn(2) == 1 then
-    last = find( v<0 );
-    first = find( v>0 );
-    nn = size(v, '*');
-    v([1:size(first, '*'), nn-size(last, '*')+1:nn]) = [gsort(v(first));gsort(v(last))];
-    A = sparse(ij, v, mn);
-  elseif mn(1) == 1 then
-    last = find( v<0 );
-    first = find( v>0 );
-    nn = size(v, '*');
-    v([1:size(first, '*'),nn-size(last, '*')+1:nn]) = [gsort(v(first));gsort(v(last))];
-    A = sparse(ij, v, mn);  
-  else
-    error(999,msprintf(_("%s: Wrong size for input argument #%d: sparse vectors expected.\n"),'gsort',1));
-  end
-endfunction
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab\r
+// Copyright (C) DIGITEO - 2009 - Allan CORNET\r
+// Copyrifht (C) 2012 - Scilab Enterprises - Adeline CARNIS\r
+// \r
+// This file must be used under the terms of the CeCILL.\r
+// This source file is licensed as described in the file COPYING, which\r
+// you should have received as part of this distribution.  The terms\r
+// are also available at    \r
+// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt\r
+\r
+function A = %sp_gsort(A, optsort, directionsort)\r
+    [ij, v, mn] = spget(A);\r
+\r
+    if mn(1) <> 1 & mn(2) <> 1 then\r
+        error(999,msprintf(_("%s: Wrong size for input argument #%d: sparse vectors expected.\n"),'gsort',1));\r
+    end\r
+\r
+    if (strcmp(optsort, 'c')) == 0 | v == [] then\r
+        A = A;\r
+    else\r
+        if mn(2) == 1 then\r
+            dif = mn(1) - length(v);\r
+            v = gsort(v, optsort, directionsort);\r
+        elseif mn(1) == 1 then\r
+            dif = mn(2) - length(v);\r
+            v = gsort(v, optsort, directionsort);\r
+        end\r
+\r
+        last = find(v<0);\r
+        first = find(v>0);\r
+\r
+        if last == [] & first <> [] then\r
+            if strcmp(directionsort, 'i')== 0 then\r
+                ij(:,1) = first(:) + dif;\r
+            else\r
+                ij(:,1) = first(:);\r
+            end\r
+        elseif first == [] & last <> [] then\r
+            ij(:,1) = last(:) + dif;\r
+        else\r
+            if strcmp(directionsort, 'i')== 0 then\r
+                ij(:,1) = [last(:); first(:) + dif];\r
+            else\r
+                ij(:,1) = [first(:); last(:) + dif];\r
+            end\r
+        end\r
+\r
+        A = sparse(ij, v, mn)\r
+    end\r
+endfunction\r
+\r\r
index fe09d65..8a7cfa5 100644 (file)
@@ -1,71 +1,77 @@
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) 1999 - INRIA - Carlos Klimann
-// 
-// This file must be used under the terms of the CeCILL.
-// This source file is licensed as described in the file COPYING, which
-// you should have received as part of this distribution.  The terms
-// are also available at
-// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
-// 
-
-
-function y=median(x,orient)
-//
-// NOTES
-//    - modified by farid.belahcene:the case when x is an hypermatrix
-//    - new syntaxes: median(x,'m') and median(x,dim)  
-
-[lhs,rhs]=argn(0)
-if argn(2)<2 then
-  orient=0;
-else
-  if orient=='r' then 
-    orient=1
-  elseif orient=='c' then 
-    orient=2
-  elseif orient=='*' then 
-    orient=0
-  elseif orient=='m' then 
-    orient=find(size(x)>1,1)
-    if orient==[] then orient=1,end
-  else
-    if type(orient)<>1|size(orient,'*')<>1|~isreal(orient)|orient<=0 then
-      error(msprintf(gettext("%s: Wrong value for input argument #%d: ''%s'', ''%s'',''%s'' or a positive number expected.\n"),"median",2,"r","c","m")),
-    end
-  end
-end
-  
-if orient==0 then
-  if x==[] then y=%nan,return,end
-  n=size(x,'*');
-  x=gsort(x(:),'g','i')
-  if 2*int(n/2)==n then
-    y = (x(n/2)+x(n/2+1))/2;
-  else 
-    y = x((n+1)/2);
-  end  
-else
-  if x==[] then y=[],return,end
-  if orient>ndims(x) then y=x; return;  end
-  xsize=size(x);
-  if xsize(orient)==1 then  y=x; return;  end
-  orient_above_size=xsize(orient+1:$);N=prod(orient_above_size)
-  orient_below_size=xsize(1:orient-1);M=prod(orient_below_size)
-  orient_size=xsize(1:orient);P=prod(orient_size)
-  y=[];
-  n=xsize(orient)
-  for k=1:N
-    for i=1:M
-      ytemp=gsort(x(i+(0:n-1)*M+(k-1)*P),'r','i'); ytemp = ytemp(:);
-      if 2*int(n/2)==n then
-           y($+1) = (ytemp(n/2,:)+ytemp(n/2+1,:))/2;
-      else 
-           y($+1) = ytemp((n+1)/2,:);
-      end
-    end
-  end
-  xsize(orient)=1;
-  y=matrix(y,xsize);
-end
-
-endfunction
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab\r
+// Copyright (C) 1999 - INRIA - Carlos Klimann\r
+// Copyright (C) 2012 - Scilab Enterprises - Adeline CARNIS\r
+// \r
+// This file must be used under the terms of the CeCILL.\r
+// This source file is licensed as described in the file COPYING, which\r
+// you should have received as part of this distribution.  The terms\r
+// are also available at\r
+// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt\r
+// \r
+\r
+\r
+function y=median(x,orient)\r
+    //\r
+    // NOTES\r
+    //    - modified by farid.belahcene:the case when x is an hypermatrix\r
+    //    - new syntaxes: median(x,'m') and median(x,dim)  \r
+\r
+    [lhs,rhs]=argn(0)\r
+    if argn(2)<2 then\r
+        orient=0;\r
+    else\r
+        if orient=='r' then \r
+            orient=1\r
+        elseif orient=='c' then \r
+            orient=2\r
+        elseif orient=='*' then \r
+            orient=0\r
+        elseif orient=='m' then \r
+            orient=find(size(x)>1,1)\r
+            if orient==[] then orient=1,end\r
+        else\r
+            if type(orient)<>1|size(orient,'*')<>1|~isreal(orient)|orient<=0 then\r
+                error(msprintf(gettext("%s: Wrong value for input argument #%d: ''%s'', ''%s'',''%s'' or a positive number expected.\n"),"median",2,"r","c","m")),\r
+            end\r
+        end\r
+    end\r
+\r
+    if orient==0 then\r
+        if x==[] then y=%nan,return,end\r
+        n=size(x,'*');\r
+        x=gsort(x(:),'g','i')\r
+        if 2*int(n/2)==n then\r
+            y = (x(n/2)+x(n/2+1))/2;\r
+        else \r
+            y = x((n+1)/2);\r
+        end  \r
+    else\r
+        if x==[] then y=[],return,end\r
+        if orient>ndims(x) then y=x; return;  end\r
+        xsize=size(x);\r
+        if xsize(orient)==1 then  y=x; return;  end\r
+        orient_above_size=xsize(orient+1:$);N=prod(orient_above_size)\r
+        orient_below_size=xsize(1:orient-1);M=prod(orient_below_size)\r
+        orient_size=xsize(1:orient);P=prod(orient_size)\r
+        y=[];\r
+        n=xsize(orient)\r
+        for k=1:N\r
+            for i=1:M\r
+                ytemp=gsort(x(i+(0:n-1)*M+(k-1)*P),'r','i'); ytemp = ytemp(:);\r
+                if 2*int(n/2)==n then\r
+                    y = [y (ytemp(n/2,:)+ytemp(n/2+1,:))/2];\r
+                else \r
+                    y = [y ytemp((n+1)/2,:)];\r
+                end\r
+            end\r
+        end\r
+        xsize(orient)=1;\r
+        y=matrix(y,xsize);\r
+    end\r
+\r
+endfunction\r
+\r
+\r
+\r
+\r
+\r\r
diff --git a/scilab/modules/statistics/tests/nonreg_tests/bug_8101.dia.ref b/scilab/modules/statistics/tests/nonreg_tests/bug_8101.dia.ref
new file mode 100644 (file)
index 0000000..842c991
--- /dev/null
@@ -0,0 +1,40 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2012 - Scilab Enterprises - Adeline CARNIS
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+// <-- Non-regression test for bug 8101 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=8101
+//
+// <-- Short Description -->
+//    The median function with a sparse as a first argument did not return the
+//    good result. Moreover, median(sparse,'r'|'c") were not supported.
+// =============================================================================
+s=sparse([1 0 2 0 0 ; 0 -4 0 0 7 ])
+ s  =
+(    2,    5) sparse matrix
+(    1,    1)        1. 
+(    1,    3)        2. 
+(    2,    2)      - 4. 
+(    2,    5)        7. 
+y = median(s);
+res = sparse(median(full(s)));
+assert_checkequal(y, res);
+y = median(s, 'r');
+res = sparse(median(full(s), 'r'));
+assert_checkequal(y, res);
+y = median(s, 'c');
+res = sparse(median(full(s), 'c'));
+assert_checkequal(y, res);
+y = median(s, 'm');
+res = sparse(median(full(s), 'm'));
+assert_checkequal(y, res);
+y = median(s, 1);
+res = sparse(median(full(s), 1));
+assert_checkequal(y, res);
diff --git a/scilab/modules/statistics/tests/nonreg_tests/bug_8101.tst b/scilab/modules/statistics/tests/nonreg_tests/bug_8101.tst
new file mode 100644 (file)
index 0000000..0efa988
--- /dev/null
@@ -0,0 +1,43 @@
+// =============================================================================\r
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab\r
+// Copyright (C) 2012 - Scilab Enterprises - Adeline CARNIS\r
+//\r
+//  This file is distributed under the same license as the Scilab package.\r
+// =============================================================================\r
+\r
+// <-- CLI SHELL MODE -->\r
+\r
+// <-- Non-regression test for bug 8101 -->\r
+//\r
+// <-- Bugzilla URL -->\r
+// http://bugzilla.scilab.org/show_bug.cgi?id=8101\r
+//\r
+// <-- Short Description -->\r
+//    The median function with a sparse as a first argument did not return the\r
+//    good result. Moreover, median(sparse,'r'|'c") were not supported.\r
+// =============================================================================\r
+\r
+s=sparse([1 0 2 0 0 ; 0 -4 0 0 7 ])\r
+y = median(s);\r
+res = sparse(median(full(s)));\r
+assert_checkequal(y, res);\r
+\r
+y = median(s, 'r');\r
+res = sparse(median(full(s), 'r'));\r
+assert_checkequal(y, res);\r
+\r
+y = median(s, 'c');\r
+res = sparse(median(full(s), 'c'));\r
+assert_checkequal(y, res);\r
+\r
+y = median(s, 'm');\r
+res = sparse(median(full(s), 'm'));\r
+assert_checkequal(y, res);\r
+\r
+y = median(s, 1);\r
+res = sparse(median(full(s), 1));\r
+assert_checkequal(y, res);\r
+\r
+\r
+\r
+\r\r