* Bug #7204 fixed - geomean(v) applied to an hypermat v gave wrong result. 07/12507/2
Samuel Gougeon [Thu, 12 Sep 2013 07:30:09 +0000 (09:30 +0200)]
Change-Id: I5c3bb23ebeb9bdb1c132d184b5de798d45577fcb

scilab/CHANGES_5.5.X
scilab/modules/statistics/macros/geomean.sci
scilab/modules/statistics/tests/nonreg_tests/bug_7204.dia.ref [new file with mode: 0644]
scilab/modules/statistics/tests/nonreg_tests/bug_7204.tst [new file with mode: 0644]

index 688637d..e8c61b9 100644 (file)
@@ -262,6 +262,8 @@ Bug fixes
 
 * Bug #7080 fixed - Some graphics macros did not use standard error messages.
 
+* Bug #7204 fixed - geomean applied to a hypermatrix gave wrong results.
+
 * Bug #7206 fixed - If the second input argument of meanf function was an hypermat, this function
                     returned an error.
 
index 2c09ecc..be839cd 100644 (file)
@@ -1,15 +1,16 @@
 
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) 1999 - INRIA - Carlos Klimann
+// Copyright (C) 2010 - Samuel GOUGEON : bug 7204, code style
 //
 // 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.1-en.txt
+// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
 //
 
-function gm=geomean(x,orien)
+function gm = geomean(x,orien)
     //
     //This function computes the geometric mean of a vector or matrix x.
     //
@@ -26,14 +27,21 @@ function gm=geomean(x,orien)
     //Statistics, J.Wiley & Sons, 1990.
     //
     //
-    if x==[] then gm=%nan, return, end
-    [lhs,rhs]=argn(0)
-    if rhs==0 then error(msprintf(gettext("%s: Wrong number of input arguments: %d to %d expected.\n"),"geomean",1,2)), end
+    if x==[] then
+        gm = %nan
+        return
+    end
+    [lhs,rhs] = argn(0)
+    if rhs==0 then
+        msg = gettext("%s: Wrong number of input arguments: %d to %d expected.\n")
+        error(msprintf(msg, "geomean",1,2))
+    end
     if rhs==1 then
-        gm=prod(x)^(1/length(x))
+        gm = prod(x)^(1/size(x,"*"))
     elseif rhs==2
-        gm=prod(x,orien).^(1/size(x,orien))
+        gm = prod(x,orien).^(1/size(x,orien))
     else
-        error(msprintf(gettext("%s: Wrong number of input arguments: %d to %d expected.\n"),"geomean",1,2)),
+        msg = gettext("%s: Wrong number of input arguments: %d to %d expected.\n")
+        error(msprintf(msg, "geomean",1,2))
     end
 endfunction
diff --git a/scilab/modules/statistics/tests/nonreg_tests/bug_7204.dia.ref b/scilab/modules/statistics/tests/nonreg_tests/bug_7204.dia.ref
new file mode 100644 (file)
index 0000000..19470a7
--- /dev/null
@@ -0,0 +1,19 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Sylvestre Ledru
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+// <-- Non-regression test for bug 7204 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=7204
+//
+// <-- Short Description -->
+//    geomean(v) applied to an hypermat v gives wrong result
+// =============================================================================
+v=rand(2,2,2);
+a=geomean(v);
+b=prod(v)^(1/8);
+assert_checkalmostequal(a,b);
diff --git a/scilab/modules/statistics/tests/nonreg_tests/bug_7204.tst b/scilab/modules/statistics/tests/nonreg_tests/bug_7204.tst
new file mode 100644 (file)
index 0000000..dba9363
--- /dev/null
@@ -0,0 +1,22 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Sylvestre Ledru
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- CLI SHELL MODE -->
+
+// <-- Non-regression test for bug 7204 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=7204
+//
+// <-- Short Description -->
+//    geomean(v) applied to an hypermat v gives wrong result
+// =============================================================================
+
+v=rand(2,2,2);
+a=geomean(v);
+b=prod(v)^(1/8);
+assert_checkalmostequal(a,b);