e593de8eacb4e88b3b39291b7e3a7efab20df244
[scilab.git] / scilab / modules / statistics / macros / variancef.sci
1
2 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 // Copyright (C) 2013 - Scilab Enterprises - Paul BIGNIER : m parameter added
4 // Copyright (C) 2013 - Samuel GOUGEON : http://bugzilla.scilab.org/11209 fixed
5 // Copyright (C) 2000 - INRIA - Carlos Klimann
6 //
7 // This file must be used under the terms of the CeCILL.
8 // This source file is licensed as described in the file COPYING, which
9 // you should have received as part of this distribution.  The terms
10 // are also available at
11 // http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
12 //
13
14 function [s, m] = variancef(x, fre, orien, m)
15     //
16     //This function  computes  the variance  of the values  of   a vector or
17     //matrix x, each  of  them  counted with  a  frequency signaled   by the
18     //corresponding values of the integer vector or matrix fre with the same
19     //type of x.
20     //
21     //For a vector or matrix  x, s=variancef(x,fre) (or s=variancef(x,fre,'*') returns
22     //in scalar s the variance  of all the  entries of x, each value counted
23     //with the multiplicity indicated by the corresponding value of fre.
24     //
25     //s=variancef(x,fre,'r')(or,   equivalently, s=variancef(x,fre,1)) returns in each
26     //entry of the row vector s  of type 1xsize(x,'c')  the variance of each
27     //column of x, each value counted with the multiplicity indicated by the
28     //corresponding value of fre.
29     //
30     //s=variancef(x,fre,'c')(or, equivalently,   s=variancef(x,fre,2)) returns in each
31     //entry of  the column vector  s of type   size(x,'c')x1 the variance of
32     //each row of  x, each value counted with  the multiplicity indicated by
33     //the corresponding value of fre.
34     //
35     //The input argument m represents the a priori mean. If it is present, then the sum is
36     //divided by n. Otherwise ("sample variance"), it is divided by n-1.
37     //
38     //
39
40     [lhs,rhs] = argn(0)
41     if rhs<2 | rhs>4 then
42         msg = gettext("%s: Wrong number of input arguments: %d to %d expected.\n")
43         error(msprintf(msg, "variancef", 2, 4))
44     end
45     if x==[] | fre==[] | fre==0
46         s = %nan
47         return
48     end
49     if rhs==2 then
50         sumfre = sum(fre)
51         if sumfre <= 1 then
52             msg = gettext("%s: Wrong value for input argument #%d: Must be > %d.\n")
53         error(msprintf(msg, "variancef", 2, 1)), end
54         m = meanf(x,fre)
55         s = sum((abs(x-m).^2).*fre) / (sumfre-1)
56         return
57     end
58     biased = %f
59     if rhs==4 then
60         if typeof(m)~="constant" then
61             tmp = gettext("%s: Wrong value of m : a priori mean expected.\n")
62             error(msprintf(tmp, "variancef", ))
63         elseif orien=="*" then
64             if ~isscalar(m) then
65                 tmp = gettext("%s: Wrong value of m : a priori mean expected.\n")
66                 error(msprintf(tmp, "variancef", ))
67             end
68         elseif orien=="r" | orien==1 then
69             if size(m)~=[1 size(x,"c")] & ~isscalar(m) then
70                 tmp = gettext("%s: Wrong value of m : a priori mean expected.\n")
71                 error(msprintf(tmp, "variancef", ))
72             end
73         elseif orien=="c" | orien==2 then
74             if size(m)~=[size(x,"r") 1] & ~isscalar(m) then
75                 tmp = gettext("%s: Wrong value of m : a priori mean expected.\n")
76                 error(msprintf(tmp, "variancef", ))
77             end
78         end
79         if isnan(m) then
80             biased = %t; // Compute the biased variance
81         end
82     end
83     if orien=="*",
84         sumfre = sum(fre)
85         if sumfre <= 1 then
86             msg = _("%s: Wrong value for input argument #%d: Must be > %d.\n")
87         error(msprintf(msg, "variancef", 2, 1)),end
88         if rhs<4 then
89             m = meanf(x,fre)
90             s = sum((abs(x-m).^2).*fre) / (sumfre-1)
91         elseif biased == %t
92             m = meanf(x,fre)
93             s = sum((abs(x-m).^2).*fre) / sumfre
94         else
95             s = sum((abs(x-m).^2).*fre) / sumfre
96         end
97     elseif orien=="r" | orien==1,
98         sumfre = sum(fre, "r")
99         if or(sumfre==0) then
100             msg = _("%s: Wrong value for input argument #%d: Must be > %d.\n")
101             error(msprintf(msg, "variancef", 2, 1))
102         end
103         if rhs<4 | biased == %t then
104             m = meanf(x,fre,"r")
105         elseif isscalar(m) then
106             m = m*ones(1, size(x,"c"));
107         end
108         m2 = ones(size(x,"r"),1)*m
109         if rhs<4 then
110             s = sum((abs(x-m2).^2).*fre, "r") ./ (sumfre-1)
111         else
112             s = sum((abs(x-m2).^2).*fre, "r") ./ sumfre
113         end
114     elseif orien=="c" | orien==2,
115         sumfre = sum(fre, "c")
116         if or(sumfre==0) then
117             msg = _("%s: Wrong value for input argument #%d: Must be > %d.\n")
118             error(msprintf(msg, "variancef", 2, 1))
119         end
120         if rhs<4 | biased == %t then
121             m = meanf(x,fre,"c")
122         elseif isscalar(m) then
123             m = m*ones(size(x,"r"), 1);
124         end
125         m2 = m*ones(1,size(x,"c"))
126         if rhs<4 then
127             s = sum((abs(x-m2).^2).*fre, "c") ./ (sumfre-1)
128         else
129             s = sum((abs(x-m2).^2).*fre, "c") ./ sumfre
130         end
131     else
132         msg = _("%s: Wrong value for input argument #%d: ''%s'', ''%s'', ''%s'', %d or %d expected.\n")
133         error(msprintf(msg, "variancef", 3, "*", "c", "r", 1, 2))
134     end
135
136 endfunction