* Bug #11209 fixed - variance returned wrong results for complex arguments.
[scilab.git] / scilab / modules / statistics / macros / variance.sci
1
2 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 // Copyright (C) 2000 - INRIA - Carlos Klimann
4 // 
5 // This file must be used under the terms of the CeCILL.
6 // This source file is licensed as described in the file COPYING, which
7 // you should have received as part of this distribution.  The terms
8 // are also available at
9 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10 // 
11
12 function [s]=variance(x,orien,w)
13 //
14 //This function computes  the  variance  of  the values of  a  vector or
15 //matrix x.
16 //
17 //For a vector or   a matrix x,  s=variance(x)  returns in  the scalar s  the
18 //variance of all the entries of x.
19 //
20 //s=variance(x,'r')    (or,  equivalently,    s=variance(x,1)) is     the  rowwise
21 //variance. It returns in each entry of the row vector s the variance of
22 //each column of x.
23 //
24 //s=variance(x,'c') (or, equivalently, s=variance(x,2)) is the columnwise standard
25 //deviation.   It  returns in  each  entry  of the   column vector y the
26 //variance of each row of x.
27 //
28 //
29   if x==[] then 
30     s=%nan;
31     return;
32   end
33   [lhs,rhs]=argn(0)
34   if rhs==0 then 
35     error(msprintf(gettext("%s: Wrong number of input arguments: %d to %d expected.\n"),"variance",1,2))
36   end
37   [m n]=size(x);
38   if rhs<=2 then 
39     w=0;
40   end
41   if rhs==1
42     s = sum(abs(x - mean(x)).^2) // equivalent to var(real(x)) + var(imag(x)) for x complexes
43     if w==0 then
44       s = s / (m*n-1);
45     elseif w==1 then
46       s = s / (m*n);
47     else
48       error(msprintf(gettext("%s: Wrong value of w : %d; 0 or 1 expected.\n"),"variance",w))
49     end
50   elseif orien=='c'|orien==2 then
51     y(1:m,1:n) = x(1:m,1:n) -  mean(x,2) * ones(1,n);
52     s = ones(m,1);
53     for i=1:m
54       s(i) = real(y(i,1:n) * y(i,1:n)');
55       if w==0 then
56         s(i) = s(i) / (n - 1);
57       elseif w==1 then
58         s(i) = s(i) / n;
59       else
60         error(msprintf(gettext("%s: Wrong value of w : %d; 0 or 1 expected.\n"),"variance",w))
61       end
62     end
63   elseif orien=='r'|orien==1 then
64     y(1:m,1:n) = x(1:m,1:n) - ones(m,1) * mean(x,1);
65     s = ones(1,n);
66     for i=1:n
67       s(i) = real(y(1:m,i)' * y(1:m,i));
68       if w==0 then
69         s(i) = s(i) / (m - 1);
70       elseif w==1 then
71         s(i) = s(i) / m;
72       else
73         error(msprintf(gettext("%s: Wrong value of w : %d; 0 or 1 expected.\n"),"variance",w))
74       end
75     end
76   else
77     error(msprintf(gettext("%s: Wrong value for input argument: ''%s'', ''%s'', %d or %d expected.\n"),"variance","c","r",1,2));
78   end
79 endfunction
80