a569e777e23a2fd535babaf960bb065c406fd62f
[scilab.git] / scilab / modules / statistics / macros / variancef.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.1-en.txt
10 //
11
12 function [s]=variancef(x,fre,orien)
13     //
14     //This function  computes  the variance  of the values  of   a vector or
15     //matrix x, each  of  them  counted with  a  frequency signaled   by the
16     //corresponding values of the integer vector or matrix fre with the same
17     //type of x.
18     //
19     //For a vector or matrix  x, s=variancef(x,fre) (or s=variancef(x,fre,'*') returns
20     //in scalar s the variance  of all the  entries of x, each value counted
21     //with the multiplicity indicated by the corresponding value of fre.
22     //
23     //s=variancef(x,fre,'r')(or,   equivalently, s=variancef(x,fre,1)) returns in each
24     //entry of the row vector s  of type 1xsize(x,'c')  the variance of each
25     //column of x, each value counted with the multiplicity indicated by the
26     //corresponding value of fre.
27     //
28     //s=variancef(x,fre,'c')(or, equivalently,   s=variancef(x,fre,2)) returns in each
29     //entry of  the column vector  s of type   size(x,'c')x1 the variance of
30     //each row of  x, each value counted with  the multiplicity indicated by
31     //the corresponding value of fre.
32     //
33     //
34     if x==[] then s=%nan, return, end
35     [lhs,rhs]=argn(0)
36     if rhs<2|rhs>3 then
37         error(msprintf(gettext("%s: Wrong number of input arguments: %d to %d expected.\n"),"variancef",2,3)),
38     end
39     if x==[]|fre==[]|fre==0, s=%nan;return,end
40     if rhs==2 then
41         sumfre=sum(fre)
42         if sumfre <= 1 then error(msprintf(gettext("%s: Wrong value for input argument #%d: Must be > %d.\n"),"variancef", 2, 1)), end
43         s=(sum(((x-meanf(x,fre)).^2).*fre))/(sumfre-1),
44         return,
45     end
46     if orien=="*",
47         sumfre=sum(fre)
48         if sumfre <= 1 then error(msprintf(gettext("%s: Wrong value for input argument #%d: Must be > %d.\n"),"variancef", 2, 1)),end
49         s=(sum(((x-meanf(x,fre)).^2).*fre))/(sumfre-1),
50     elseif orien=="r"|orien==1,
51         sumfre=sum(fre,"r")
52         if or(sumfre==0) then error(msprintf(gettext("%s: Wrong value for input argument #%d: Must be > %d.\n"),"variancef",2,1)),end
53         s=(sum(((x-ones(size(x,"r"),1)*meanf(x,fre,"r")).^2).*fre))./ ..
54         (sumfre-1)
55     elseif orien=="c"|orien==2,
56         sumfre=sum(fre,"c")
57         if or(sumfre==0) then error(msprintf(gettext("%s: Wrong value for input argument #%d: Must be > %d.\n"),"variancef",2,1)),end
58         s=(sum((x-(meanf(x,fre,"c")*ones(1,size(x,"c")))).^2,"c"))./..
59         (sumfre-1)
60     else error(msprintf(gettext("%s: Wrong value for input argument #%d: ''%s'', ''%s'', ''%s'', %d or %d expected.\n"),"variancef",3,"*","c","r",1,2))
61     end
62 endfunction