* Bug #11209 fixed - variance returned wrong results for complex arguments. 04/10704/5
Samuel GOUGEON [Wed, 6 Mar 2013 07:51:54 +0000 (08:51 +0100)]
Change-Id: Idccae872be60ef42af6f29b093404aee181758a5

scilab/CHANGES_5.4.X
scilab/modules/statistics/macros/variance.sci
scilab/modules/statistics/tests/nonreg_tests/bug_11209.dia.ref [new file with mode: 0644]
scilab/modules/statistics/tests/nonreg_tests/bug_11209.tst [new file with mode: 0644]
scilab/modules/statistics/tests/unit_tests/variance.dia.ref
scilab/modules/statistics/tests/unit_tests/variance.tst

index 99341cf..2423b6f 100644 (file)
@@ -273,6 +273,8 @@ Bug fixes
 
 * Bug #10815 fixed - diff help page did not have a "See Also" section.
 
+* Bug #11209 fixed - variance returned wrong results for complex arguments.
+
 * Bug #11134 fixed - xgetmouse() prevented callback menu execution.
 
 * Bug #11362 fixed - Doc of axes_properties did not explain that
index 5290ff2..1417695 100644 (file)
@@ -39,10 +39,11 @@ function [s]=variance(x,orien,w)
     w=0;
   end
   if rhs==1
+    s = sum(abs(x - mean(x)).^2) // equivalent to var(real(x)) + var(imag(x)) for x complexes
     if w==0 then
-      s=(sum((x-mean(x)).^2))/(m*n-1);
+      s = s / (m*n-1);
     elseif w==1 then
-      s=(sum((x-mean(x)).^2))/(m*n);
+      s = s / (m*n);
     else
       error(msprintf(gettext("%s: Wrong value of w : %d; 0 or 1 expected.\n"),"variance",w))
     end
diff --git a/scilab/modules/statistics/tests/nonreg_tests/bug_11209.dia.ref b/scilab/modules/statistics/tests/nonreg_tests/bug_11209.dia.ref
new file mode 100644 (file)
index 0000000..fdef802
--- /dev/null
@@ -0,0 +1,20 @@
+// =============================================================================
+// 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 11209 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=11209
+//
+// <-- Short Description -->
+//     variance returned wrong results for complex arguments.
+// =============================================================================
+a = [1,2,3,4,5];
+b = a + a*%i;
+assert_checkequal(variance(a),2.5);
+assert_checkalmostequal(variance(b), 5);
+assert_checkfalse(variance(b) == 5*%i);
diff --git a/scilab/modules/statistics/tests/nonreg_tests/bug_11209.tst b/scilab/modules/statistics/tests/nonreg_tests/bug_11209.tst
new file mode 100644 (file)
index 0000000..5a988bf
--- /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 11209 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=11209
+//
+// <-- Short Description -->
+//     variance returned wrong results for complex arguments.
+// =============================================================================
+a = [1,2,3,4,5];
+b = a + a*%i;
+assert_checkequal(variance(a),2.5);
+assert_checkalmostequal(variance(b), 5);
+assert_checkfalse(variance(b) == 5*%i);
index 929c74f..69fed24 100644 (file)
@@ -45,7 +45,7 @@ a = [ 0.9, 0.7;
 0.5, 0.4 ];
 data = a + a * 2 * %i;
 computed = variance(data);
-expected = - 0.3089999999999999413802 + 0.4119999999999999218403 * %i;
+expected = 0.515;   // must be variance(real(data)) + variance(imag(data))
 if abs(computed-expected)>%eps then bugmes();quit;end
 // With x as a complex row vector and computation by column
 a = [ 0.9, 0.7;
@@ -61,13 +61,13 @@ a = [ 0.9, 0.7;
 0.5, 0.4 ];
 data = a + a * 2 * %i;
 computed = variance(data,2);
-expected = [0.1
-    0.
+expected = [0.1    
+    0.     
     0.025];
 if abs(computed-expected)>%eps then bugmes();quit;end
 // Normalization with N-1
-x = [0.9    0.7
-    0.1    0.1
+x = [0.9    0.7  
+    0.1    0.1  
     0.5    0.4];
 orien = 1;
 w = 0;
@@ -75,8 +75,8 @@ computed = variance(x,orien,w);
 expected = [0.16 0.09];
 if abs(computed-expected)>%eps then bugmes();quit;end
 // Normalization with N
-x = [0.9    0.7
-    0.1    0.1
+x = [0.9    0.7  
+    0.1    0.1  
     0.5    0.4];
 orien = 1;
 w = 1;
index fac2669..fd0e789 100644 (file)
@@ -47,7 +47,7 @@ a = [ 0.9, 0.7;
 0.5, 0.4 ];
 data = a + a * 2 * %i;
 computed = variance(data);
-expected = - 0.3089999999999999413802 + 0.4119999999999999218403 * %i;
+expected = 0.515;   // must be variance(real(data)) + variance(imag(data))
 if abs(computed-expected)>%eps then pause,end
 
 // With x as a complex row vector and computation by column