* Bug #7858 fixed - Statistics: variance and variancef
[scilab.git] / scilab / modules / statistics / macros / variancef.sci
index 7d30847..b36d14c 100644 (file)
-
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) 2000 - INRIA - Carlos Klimann
-//
-// 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
-//
-
-function [s,m]=variancef(x,fre,orien,m)
-    //
-    //This function  computes  the variance  of the values  of   a vector or
-    //matrix x, each  of  them  counted with  a  frequency signaled   by the
-    //corresponding values of the integer vector or matrix fre with the same
-    //type of x.
-    //
-    //For a vector or matrix  x, s=variancef(x,fre) (or s=variancef(x,fre,'*') returns
-    //in scalar s the variance  of all the  entries of x, each value counted
-    //with the multiplicity indicated by the corresponding value of fre.
-    //
-    //s=variancef(x,fre,'r')(or,   equivalently, s=variancef(x,fre,1)) returns in each
-    //entry of the row vector s  of type 1xsize(x,'c')  the variance of each
-    //column of x, each value counted with the multiplicity indicated by the
-    //corresponding value of fre.
-    //
-    //s=variancef(x,fre,'c')(or, equivalently,   s=variancef(x,fre,2)) returns in each
-    //entry of  the column vector  s of type   size(x,'c')x1 the variance of
-    //each row of  x, each value counted with  the multiplicity indicated by
-    //the corresponding value of fre.
-    //
-    //The input argument m represents the a priori mean. If it is present, then the sum is
-    //divided by n. Otherwise ("sample variance"), it is divided by n-1.
-    //
-    //
-    if x==[] then s=%nan, return, end
-    [lhs,rhs]=argn(0)
-    if rhs<2|rhs>4 then
-        error(msprintf(gettext("%s: Wrong number of input arguments: %d to %d expected.\n"),"variancef",2,4)),
-    end
-    if x==[]|fre==[]|fre==0, s=%nan;return,end
-    if rhs==2 then
-        sumfre=sum(fre)
-        if sumfre <= 1 then error(msprintf(gettext("%s: Wrong value for input argument #%d: Must be > %d.\n"),"variancef", 2, 1)), end
-        m = meanf(x,fre)
-        s=(sum(((x-m).^2).*fre))/(sumfre-1),
-        return,
-    end
-    biased = %f
-    if rhs==4 then
-        if typeof(m)~="constant" then
-            tmp = gettext("%s: Wrong value of m : a priori mean expected.\n")
-            error(msprintf(tmp, "variance", ))
-        elseif orien=="*" then
-            if ~isscalar(m) then
-                tmp = gettext("%s: Wrong value of m : a priori mean expected.\n")
-                error(msprintf(tmp, "variance", ))
-            end
-        elseif orien=="r" | orien==1 then
-            if size(m)~=[1 size(x,"c")] & ~isscalar(m) then
-                tmp = gettext("%s: Wrong value of m : a priori mean expected.\n")
-                error(msprintf(tmp, "variance", ))
-            end
-        elseif orien=="c" | orien==2 then
-            if size(m)~=[size(x,"r") 1] & ~isscalar(m) then
-                tmp = gettext("%s: Wrong value of m : a priori mean expected.\n")
-                error(msprintf(tmp, "variance", ))
-            end
-        end
-        if isnan(m) then
-            biased = %t; // Compute the biased variance
-        end
-    end
-    if orien=="*",
-        sumfre=sum(fre)
-        if sumfre <= 1 then error(msprintf(gettext("%s: Wrong value for input argument #%d: Must be > %d.\n"),"variancef", 2, 1)),end
-        if rhs<4 then
-            m = meanf(x,fre)
-            s=(sum(((x-m).^2).*fre))/(sumfre-1),
-        elseif biased == %t
-            m = meanf(x,fre)
-            s=(sum(((x-m).^2).*fre))/sumfre,
-        else
-            s=(sum(((x-m).^2).*fre))/sumfre,
-        end
-    elseif orien=="r"|orien==1,
-        sumfre=sum(fre,"r")
-        if or(sumfre==0) then error(msprintf(gettext("%s: Wrong value for input argument #%d: Must be > %d.\n"),"variancef",2,1)),end
-        if rhs<4 | biased == %t then
-            m = meanf(x,fre,"r")
-        elseif isscalar(m) then
-            m = m*ones(1, size(x,"c"));
-        end
-        m2 = ones(size(x,"r"),1)*m
-        if rhs<4 then
-            s=(sum(((x-m2).^2).*fre))./(sumfre-1)
-        else
-            s=(sum(((x-m2).^2).*fre))./sumfre
-        end
-    elseif orien=="c"|orien==2,
-        sumfre=sum(fre,"c")
-        if or(sumfre==0) then error(msprintf(gettext("%s: Wrong value for input argument #%d: Must be > %d.\n"),"variancef",2,1)),end
-        if rhs<4 | biased == %t then
-            m = meanf(x,fre,"c")
-        elseif isscalar(m) then
-            m = m*ones(size(x,"r"), 1);
-        end
-        m2 = m*ones(1,size(x,"c"))
-        if rhs<4 then
-            s=(sum((x-m2).^2,"c"))./(sumfre-1)
-        else
-            s=(sum((x-m2).^2,"c"))./sumfre
-        end
-    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))
-    end
-
-endfunction
+\r
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab\r
+// Copyright (C) 2013 - Scilab Enterprises - Paul BIGNIER : m parameter added\r
+// Copyright (C) 2013 - Samuel GOUGEON : http://bugzilla.scilab.org/11209 fixed\r
+// Copyright (C) 2000 - INRIA - Carlos Klimann\r
+//\r
+// This file must be used under the terms of the CeCILL.\r
+// This source file is licensed as described in the file COPYING, which\r
+// you should have received as part of this distribution.  The terms\r
+// are also available at\r
+// http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt\r
+//\r
+\r
+function [s, m] = variancef(x, fre, orien, m)\r
+    //\r
+    //This function  computes  the variance  of the values  of   a vector or\r
+    //matrix x, each  of  them  counted with  a  frequency signaled   by the\r
+    //corresponding values of the integer vector or matrix fre with the same\r
+    //type of x.\r
+    //\r
+    //For a vector or matrix  x, s=variancef(x,fre) (or s=variancef(x,fre,'*') returns\r
+    //in scalar s the variance  of all the  entries of x, each value counted\r
+    //with the multiplicity indicated by the corresponding value of fre.\r
+    //\r
+    //s=variancef(x,fre,'r')(or,   equivalently, s=variancef(x,fre,1)) returns in each\r
+    //entry of the row vector s  of type 1xsize(x,'c')  the variance of each\r
+    //column of x, each value counted with the multiplicity indicated by the\r
+    //corresponding value of fre.\r
+    //\r
+    //s=variancef(x,fre,'c')(or, equivalently,   s=variancef(x,fre,2)) returns in each\r
+    //entry of  the column vector  s of type   size(x,'c')x1 the variance of\r
+    //each row of  x, each value counted with  the multiplicity indicated by\r
+    //the corresponding value of fre.\r
+    //\r
+    //The input argument m represents the a priori mean. If it is present, then the sum is\r
+    //divided by n. Otherwise ("sample variance"), it is divided by n-1.\r
+    //\r
+    //\r
+\r
+    [lhs,rhs] = argn(0)\r
+    if rhs<2 | rhs>4 then\r
+        msg = gettext("%s: Wrong number of input arguments: %d to %d expected.\n")\r
+        error(msprintf(msg, "variancef", 2, 4))\r
+    end\r
+    if x==[] | fre==[] | fre==0\r
+        s = %nan\r
+        return\r
+    end\r
+    if rhs==2 then\r
+        sumfre = sum(fre)\r
+        if sumfre <= 1 then\r
+            msg = gettext("%s: Wrong value for input argument #%d: Must be > %d.\n")\r
+        error(msprintf(msg, "variancef", 2, 1)), end\r
+        m = meanf(x,fre)\r
+        s = sum((abs(x-m).^2).*fre) / (sumfre-1)\r
+        return\r
+    end\r
+    biased = %f\r
+    if rhs==4 then\r
+        if typeof(m)~="constant" then\r
+            tmp = gettext("%s: Wrong value of m : a priori mean expected.\n")\r
+            error(msprintf(tmp, "variancef", ))\r
+        elseif orien=="*" then\r
+            if ~isscalar(m) then\r
+                tmp = gettext("%s: Wrong value of m : a priori mean expected.\n")\r
+                error(msprintf(tmp, "variancef", ))\r
+            end\r
+        elseif orien=="r" | orien==1 then\r
+            if size(m)~=[1 size(x,"c")] & ~isscalar(m) then\r
+                tmp = gettext("%s: Wrong value of m : a priori mean expected.\n")\r
+                error(msprintf(tmp, "variancef", ))\r
+            end\r
+        elseif orien=="c" | orien==2 then\r
+            if size(m)~=[size(x,"r") 1] & ~isscalar(m) then\r
+                tmp = gettext("%s: Wrong value of m : a priori mean expected.\n")\r
+                error(msprintf(tmp, "variancef", ))\r
+            end\r
+        end\r
+        if isnan(m) then\r
+            biased = %t; // Compute the biased variance\r
+        end\r
+    end\r
+    if orien=="*",\r
+        sumfre = sum(fre)\r
+        if sumfre <= 1 then\r
+            msg = _("%s: Wrong value for input argument #%d: Must be > %d.\n")\r
+        error(msprintf(msg, "variancef", 2, 1)),end\r
+        if rhs<4 then\r
+            m = meanf(x,fre)\r
+            s = sum((abs(x-m).^2).*fre) / (sumfre-1)\r
+        elseif biased == %t\r
+            m = meanf(x,fre)\r
+            s = sum((abs(x-m).^2).*fre) / sumfre\r
+        else\r
+            s = sum((abs(x-m).^2).*fre) / sumfre\r
+        end\r
+    elseif orien=="r" | orien==1,\r
+        sumfre = sum(fre, "r")\r
+        if or(sumfre==0) then\r
+            msg = _("%s: Wrong value for input argument #%d: Must be > %d.\n")\r
+            error(msprintf(msg, "variancef", 2, 1))\r
+        end\r
+        if rhs<4 | biased == %t then\r
+            m = meanf(x,fre,"r")\r
+        elseif isscalar(m) then\r
+            m = m*ones(1, size(x,"c"));\r
+        end\r
+        m2 = ones(size(x,"r"),1)*m\r
+        if rhs<4 then\r
+            s = sum((abs(x-m2).^2).*fre, "r") ./ (sumfre-1)\r
+        else\r
+            s = sum((abs(x-m2).^2).*fre, "r") ./ sumfre\r
+        end\r
+    elseif orien=="c" | orien==2,\r
+        sumfre = sum(fre, "c")\r
+        if or(sumfre==0) then\r
+            msg = _("%s: Wrong value for input argument #%d: Must be > %d.\n")\r
+            error(msprintf(msg, "variancef", 2, 1))\r
+        end\r
+        if rhs<4 | biased == %t then\r
+            m = meanf(x,fre,"c")\r
+        elseif isscalar(m) then\r
+            m = m*ones(size(x,"r"), 1);\r
+        end\r
+        m2 = m*ones(1,size(x,"c"))\r
+        if rhs<4 then\r
+            s = sum((abs(x-m2).^2).*fre, "c") ./ (sumfre-1)\r
+        else\r
+            s = sum((abs(x-m2).^2).*fre, "c") ./ sumfre\r
+        end\r
+    else\r
+        msg = _("%s: Wrong value for input argument #%d: ''%s'', ''%s'', ''%s'', %d or %d expected.\n")\r
+        error(msprintf(msg, "variancef", 3, "*", "c", "r", 1, 2))\r
+    end\r
+\r
+endfunction\r