* Bug #7593 fixed - Regroup the std deviation functions 33/12833/19
Paul BIGNIER [Fri, 4 Oct 2013 15:54:04 +0000 (17:54 +0200)]
stdev now encompasses msd and st_deviation, which are tagged obsolete.

st_deviation was just a duplicate of stdev, but to extend stdev to msd,
stdev now takes a new input argument to switch between both,
which is the a priori mean.

Change-Id: I1ad2599a661643b3f67fb14c53d67bb3807557c5

22 files changed:
SEP/INDEX
SEP/SEP_111_stdev.odt [new file with mode: 0644]
scilab/CHANGES_5.5.X
scilab/modules/compatibility_functions/macros/mtlb_std.sci
scilab/modules/compatibility_functions/tests/unit_tests/mtlb_std.dia.ref [new file with mode: 0644]
scilab/modules/compatibility_functions/tests/unit_tests/mtlb_std.tst [new file with mode: 0644]
scilab/modules/overloading/macros/%hm_st_deviation.sci [deleted file]
scilab/modules/overloading/macros/%hm_stdev.sci [new file with mode: 0644]
scilab/modules/statistics/help/en_US/descriptive_statistics/msd.xml
scilab/modules/statistics/help/en_US/descriptive_statistics/st_deviation.xml
scilab/modules/statistics/help/en_US/descriptive_statistics/stdev.xml [new file with mode: 0644]
scilab/modules/statistics/help/fr_FR/descriptive_statistics/st_deviation.xml
scilab/modules/statistics/help/fr_FR/descriptive_statistics/stdev.xml [new file with mode: 0644]
scilab/modules/statistics/macros/msd.sci
scilab/modules/statistics/macros/st_deviation.sci
scilab/modules/statistics/macros/stdev.sci
scilab/modules/statistics/tests/nonreg_tests/bug_1742.dia.ref
scilab/modules/statistics/tests/nonreg_tests/bug_2407.dia.ref
scilab/modules/statistics/tests/nonreg_tests/bug_7593.dia.ref [new file with mode: 0644]
scilab/modules/statistics/tests/nonreg_tests/bug_7593.tst [new file with mode: 0644]
scilab/modules/statistics/tests/unit_tests/stdev.dia.ref
scilab/modules/statistics/tests/unit_tests/stdev.tst

index 2732f6c..44a85b4 100644 (file)
--- a/SEP/INDEX
+++ b/SEP/INDEX
@@ -106,7 +106,7 @@ SEP #107: Add an xcosAddToolsMenu and xcosUpdateBlock to ease external tools int
 SEP #108: 3-D arrows with xarrows
 SEP #109: New input argument for neldermead_search(), to control warnings.
 SEP #110: /* RESERVED */
-SEP #111: /* RESERVED */
+SEP #111: New input argument to stdev. st_deviation and msd tagged as obsolete.
 SEP #112: variance and variancef can now return the mean of the input in a new output argument and take the a priori mean as input.
 SEP #113: resize_matrix hypermatrices support.
 SEP #114: New function jcreatejar.
diff --git a/SEP/SEP_111_stdev.odt b/SEP/SEP_111_stdev.odt
new file mode 100644 (file)
index 0000000..aeaf2ed
Binary files /dev/null and b/SEP/SEP_111_stdev.odt differ
index cb082a5..c8ad0d1 100644 (file)
@@ -13,6 +13,13 @@ New Features
 * modulo() and pmodulo() now support integers & hypermatrices (See bug #13002).
 
 
+Obsolete & Removed Functions
+============================
+
+* msd and st_deviation tagged as obsolete (See bug #7593). Will be removed in Scilab 5.5.1.
+  Please use stdev instead.
+
+
 Scilab Bug Fixes
 ================
 
@@ -39,6 +46,8 @@ Scilab Bug Fixes
 
 * Bug #7570 fixed - The switch criterion on x and y is now explicited in beta() help page.
 
+* Bug #7593 fixed - stdev now encompasses msd and st_deviation thanks to a new optional input argument.
+
 * Bug #7705 fixed - In the Genetic algorithms help pages, documented the
                     "dimension", "minbounds" and "maxbounds" fields.
 
@@ -396,6 +405,8 @@ Obsolete & Removed Functions
 
 * milk_drop tagged as obsolete. Will be removed in Scilab 5.5.1.
 
+* st_deviation and msd tagged as obsolete, please use stdev intead. Will be removed in Scilab 5.5.1.
+
 
 Scilab Bug Fixes
 ================
index 50bda66..c73c6ea 100644 (file)
@@ -1,4 +1,5 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Paul Bignier
 // Copyright (C) ???? - INRIA - Scilab
 //
 // This file must be used under the terms of the CeCILL.
@@ -7,18 +8,21 @@
 // are also available at
 // http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
 
-function m = mtlb_std(x,flag) ;
-    [lhs,rhs]=argn()
-    if rhs<2 then flag=0,end
-    if or(size(x)==1) then
-        m=st_deviation(x)
-        n=size(x,"*")
-    else
-        m=st_deviation(x,"r")
-        n=size(x,1)
+function m = mtlb_std(x, flag, dim)
+
+    [lhs, rhs] = argn();
+
+    if rhs < 2 then
+        flag = 0;
+    elseif rhs < 3 then
+        dim = "*";
     end
 
-    if flag==1 then
-        m=m*sqrt(1-1/n)
+    m = stdev(x, dim);
+    n = size(x, dim);
+
+    if flag == 1 then
+        m = m*sqrt(1-1/n);
     end
+
 endfunction
diff --git a/scilab/modules/compatibility_functions/tests/unit_tests/mtlb_std.dia.ref b/scilab/modules/compatibility_functions/tests/unit_tests/mtlb_std.dia.ref
new file mode 100644 (file)
index 0000000..6ccd037
--- /dev/null
@@ -0,0 +1,15 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Paul Bignier
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+X = [1 5 9; 7 15 22];
+assert_checkalmostequal(mtlb_std(X, 0), 7.547626558506);
+assert_checkalmostequal(mtlb_std(X, 1), 6.890008869531);
+assert_checkalmostequal(mtlb_std(X, 0, 1), [4.242640687119 7.071067811865 9.192388155425]);
+assert_checkalmostequal(mtlb_std(X, 0, 2), [4 ; 7.505553499465]);
+assert_checkalmostequal(mtlb_std(X, 1, 1), [3 5 6.5]);
+assert_checkalmostequal(mtlb_std(X, 1, 2), [3.265986323711 ; 6.128258770283]);
diff --git a/scilab/modules/compatibility_functions/tests/unit_tests/mtlb_std.tst b/scilab/modules/compatibility_functions/tests/unit_tests/mtlb_std.tst
new file mode 100644 (file)
index 0000000..1c9f456
--- /dev/null
@@ -0,0 +1,19 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Paul Bignier
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+
+X = [1 5 9; 7 15 22];
+
+assert_checkalmostequal(mtlb_std(X, 0), 7.547626558506);
+assert_checkalmostequal(mtlb_std(X, 1), 6.890008869531);
+
+assert_checkalmostequal(mtlb_std(X, 0, 1), [4.242640687119 7.071067811865 9.192388155425]);
+assert_checkalmostequal(mtlb_std(X, 0, 2), [4 ; 7.505553499465]);
+
+assert_checkalmostequal(mtlb_std(X, 1, 1), [3 5 6.5]);
+assert_checkalmostequal(mtlb_std(X, 1, 2), [3.265986323711 ; 6.128258770283]);
diff --git a/scilab/modules/overloading/macros/%hm_st_deviation.sci b/scilab/modules/overloading/macros/%hm_st_deviation.sci
deleted file mode 100644 (file)
index 3e251c4..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) INRIA
-//
-// 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 x=%hm_st_deviation(m,d)
-    if argn(2)==1|d=="*" then
-        x=st_deviation(m.entries)
-        return
-    end
-    dims=double(m.dims);
-    N=size(dims,"*");
-    p1=prod(dims(1:d-1));// step to build one vector on which st_deviation is applied
-    p2=p1*dims(d);//step for beginning of next vectors
-    ind=(0:p1:p2-1)';// selection for building one vector
-    deb=(1:p1);
-    I=ind*ones(deb)+ones(ind)*deb
-
-    ind=(0:p2:prod(dims)-1);
-    I=ones(ind).*.I+ind.*.ones(I)
-
-    x=st_deviation(matrix(m.entries(I),dims(d),-1),1)
-    dims(d)=1
-    if d==N then
-        dims=dims(1:$)
-    else
-        dims(d)=1
-    end
-    if size(dims,"*")==2 then
-        x=matrix(x,dims(1),dims(2))
-    else
-        x=hypermat(dims,x)
-    end
-endfunction
diff --git a/scilab/modules/overloading/macros/%hm_stdev.sci b/scilab/modules/overloading/macros/%hm_stdev.sci
new file mode 100644 (file)
index 0000000..0f90281
--- /dev/null
@@ -0,0 +1,62 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) INRIA
+//
+// 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 x = %hm_stdev(m, d, ms)
+
+    if argn(2) < 3 then
+        ms = %f
+    end
+    if argn(2) == 3 & type(ms)~=1 & typeof(ms) ~= "hypermat" then
+        error(msprintf(_("%s: Wrong type for input argument #%d: A real matrix expected.\n"),"stdev",3));
+    end
+    if argn(2) == 1 | d == "*" then
+        if argn(2) == 3 then
+            x = stdev(m.entries, "*", ms);
+        else
+            x = stdev(m.entries, "*");
+        end
+        return
+    elseif d == "r" then
+        d = 1;
+    elseif d == "c" then
+        d = 2;
+    end
+    dims = double(m.dims);
+    if d > size(m,d) then
+        x = zeros(m);
+        return
+    end
+    N = size(dims, "*");
+    p1 = prod(dims(1:d-1));// step to build one vector on which stdev is applied
+    p2 = p1*dims(d);//step for beginning of next vectors
+    ind = (0:p1:p2-1)';// selection for building one vector
+    deb = (1:p1);
+    I = ind*ones(deb)+ones(ind)*deb;
+
+    ind = (0:p2:prod(dims)-1);
+    I = ones(ind).*.I+ind.*.ones(I);
+
+    if argn(2) == 3 then
+        x = stdev(matrix(m.entries(I),dims(d),-1), 1, ms.entries');
+    else
+        x = stdev(matrix(m.entries(I),dims(d),-1), 1);
+    end
+    dims(d) = 1;
+    if d == N then
+        dims = dims(1:$)
+    else
+        dims(d) = 1
+    end
+    if size(dims, "*") == 2 then
+        x = matrix(x, dims(1), dims(2))
+    else
+        x = hypermat(dims, x)
+    end
+
+endfunction
index b0cbec8..dbf7fd2 100644 (file)
@@ -1,25 +1,29 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2013 - Scilab Enterprises - Paul Bignier: made obsolete, merged in stdev
  * 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    
+ * are also available at
  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
  *
  -->
 <refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org" xml:lang="en" xml:id="msd">
     <refnamediv>
         <refname>msd</refname>
-        <refpurpose>mean squared deviation</refpurpose>
+        <refpurpose>
+            mean squared deviation
+            <emphasis role="bold">This function is obsolete.</emphasis>
+        </refpurpose>
     </refnamediv>
     <refsynopsisdiv>
         <title>Calling Sequence</title>
-        <synopsis>y=msd(x)
-            y=msd(x,'r') or m=msd(x,1)
-            y=msd(x,'c') or m=msd(x,2)
+        <synopsis>y = msd(x)
+            y = msd(x, "r") or m = msd(x, 1)
+            y = msd(x, "c") or m = msd(x, 2)
         </synopsis>
     </refsynopsisdiv>
     <refsection>
     <refsection>
         <title>Description</title>
         <para>
-            This function computes the  mean squared deviation of  the values of a
-            vector or matrix <literal> x</literal>.
+            This function computes the mean squared deviation of the values of a
+            vector or matrix <literal>x</literal>.
         </para>
         <para>
-            For  a vector or a matrix  <literal> x</literal>, <literal>  y=msd(x) </literal> returns in the
-            scalar <literal> y</literal> the mean squared deviation of all the entries of <literal> x</literal>.
+            For a vector or a matrix <literal> x</literal>, <literal> y=msd(x) </literal> returns in the
+            scalar <literal>y</literal> the mean squared deviation of all the entries of <literal> x</literal>.
         </para>
         <para>
-            <literal> y=msd(x,'r') </literal>   (or, equivalently, <literal>  y=msd(x,1) </literal>)  is the
-            rowwise mean squared  deviation. It returns  in each entry of the  row
-            vector  <literal> y</literal> the  mean squared deviation  of each column of <literal> x </literal>.
+            <literal> y=msd(x,'r') </literal> (or, equivalently, <literal> y=msd(x,1) </literal>) is the
+            rowwise mean squared  deviation. It returns in each entry of the row
+            vector <literal>y</literal> the mean squared deviation of each column of <literal> x </literal>.
         </para>
         <para>
-            <literal> y=msd(x,'c')  </literal> (or,  equivalently,  <literal> m=msd(x,2)  </literal>) is the
-            columnwise mean squared  deviation.  It returns in  each entry  of the
-            column vector <literal> y</literal> the mean squared deviation of  each row of <literal> x</literal>.
+            <literal> y=msd(x,'c') </literal> (or, equivalently, <literal> m=msd(x,2) </literal>) is the
+            columnwise mean squared deviation. It returns in each entry of the
+            column vector <literal> y </literal> the mean squared deviation of each row of <literal>x</literal>.
         </para>
+        <warning>
+            This function is obsolete.
+            It is better to use <link linkend="stdev">stdev</link> instead of <code>msd</code>.
+            <literal>msd(x) => stdev(x, "*", %nan)</literal>,
+            <literal>msd(x, "r") => stdev(x, "r", %nan)</literal>,
+            <literal>msd(x, "c") => stdev(x, "c", %nan)</literal>.
+        </warning>
     </refsection>
     <refsection>
         <title>Examples</title>
-        <programlisting role="example"><![CDATA[ 
-x=[0.2113249 0.0002211 0.6653811;0.7560439 0.3303271 0.6283918]
-m=msd(x)
-m=msd(x,'r')
-m=msd(x,'c')
+        <programlisting role="example"><![CDATA[
+x = [0.2113249 0.0002211 0.6653811; 0.7560439 0.3303271 0.6283918]
+m = msd(x)
+m = msd(x, "r")
+m = msd(x, "c")
  ]]></programlisting>
     </refsection>
     <refsection>
@@ -69,4 +80,15 @@ m=msd(x,'c')
             Wonacott, T.H. &amp; Wonacott, R.J.; Introductory Statistics, fifth edition, J.Wiley &amp; Sons, 1990.
         </para>
     </refsection>
+    <refsection>
+        <title>History</title>
+        <revhistory>
+            <revision>
+                <revnumber>5.5.0</revnumber>
+                <revdescription>
+                    Function tagged as obsolete. Will be removed in 5.5.1. Please use <link linkend="stdev">stdev</link> instead.
+                </revdescription>
+            </revision>
+        </revhistory>
+    </refsection>
 </refentry>
index d5471a9..e573d29 100644 (file)
@@ -1,12 +1,13 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- * Copyright (C) 2000 - INRIA - 
- * 
+ * Copyright (C) 2013 - Scilab Enterprises - Paul Bignier: made obsolete, merged in stdev
+ * Copyright (C) 2000 - INRIA -
+ *
  * 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    
+ * are also available at
  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
  *
  -->
@@ -15,6 +16,7 @@
         <refname>st_deviation</refname>
         <refpurpose>standard deviation (row or
             column-wise) of vector/matrix entries
+            <emphasis role="bold">This function is obsolete.</emphasis>
         </refpurpose>
     </refnamediv>
     <refnamediv xml:id="stdev">
     </refsection>
     <refsection>
         <title>Description</title>
+        <warning>
+            This function is obsolete.
+            It is better to use <link linkend="stdev">stdev</link> instead.
+        </warning>
         <para>
             st_deviation computes the "sample" standard deviation, that
             is, it is normalized by N-1, where N is the sequence length.
         </para>
         <para>
             <literal>y=st_deviation(x,'r')</literal> (or, equivalently,
-            <literal>y=st_deviation(x,1)</literal>) is the rowwise standard deviation. It returns in each 
+            <literal>y=st_deviation(x,1)</literal>) is the rowwise standard deviation. It returns in each
             entry of the column vector <literal>y</literal> the standard deviation of each row of <literal>x</literal>.
         </para>
         <para>
-            <literal>y=st_deviation(x,'c')</literal> (or, equivalently, <literal>y=st_deviation(x,2)</literal>) is the columnwise st_deviation. It returns in each entry of the row vector 
+            <literal>y=st_deviation(x,'c')</literal> (or, equivalently, <literal>y=st_deviation(x,2)</literal>) is the columnwise st_deviation. It returns in each entry of the row vector
             <literal>y</literal> the standard deviation of each column  of <literal>x</literal>.
         </para>
     </refsection>
     <refsection>
         <title>Examples</title>
-        <programlisting role="example"><![CDATA[ 
+        <programlisting role="example"><![CDATA[
 A=[1,2,10;7,7.1,7.01];
 st_deviation(A)
 st_deviation(A,'r')
@@ -97,4 +103,15 @@ st_deviation(A,'c')
             </member>
         </simplelist>
     </refsection>
+    <refsection>
+        <title>History</title>
+        <revhistory>
+            <revision>
+                <revnumber>5.5.0</revnumber>
+                <revdescription>
+                    Function tagged as obsolete. Will be removed in 5.5.1. Please use <link linkend="stdev">stdev</link> instead.
+                </revdescription>
+            </revision>
+        </revhistory>
+    </refsection>
 </refentry>
diff --git a/scilab/modules/statistics/help/en_US/descriptive_statistics/stdev.xml b/scilab/modules/statistics/help/en_US/descriptive_statistics/stdev.xml
new file mode 100644 (file)
index 0000000..f5f1ec3
--- /dev/null
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2013 - Scilab Enterprises - Paul Bignier: added mean squared deviation
+ *                                                         (third input argument)
+ * Copyright (C) 2000 - INRIA -
+ *
+ * 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
+ *
+ -->
+<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org" xml:lang="en" xml:id="stdev">
+    <refnamediv>
+        <refname>stdev</refname>
+        <refpurpose>
+            standard deviation (row orcolumn-wise) of vector/matrix entries
+        </refpurpose>
+    </refnamediv>
+    <refsynopsisdiv>
+        <title>Calling Sequence</title>
+        <synopsis>
+            y = stdev(x)
+            y = stdev(x, '*')
+            y = stdev(x, 'r')
+            y = stdev(x, 'c')
+            y = stdev(x, orien, m)
+        </synopsis>
+    </refsynopsisdiv>
+    <refsection>
+        <title>Arguments</title>
+        <variablelist>
+            <varlistentry>
+                <term>x, y</term>
+                <listitem>
+                    <para>real vector, matrix or hypermatrix</para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>y</term>
+                <listitem>
+                    <para>real scalar, vector or matrix</para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>orien</term>
+                <listitem>
+                    <para>
+                        string scalar or positive integer, can be <literal>"*"</literal>, <literal>"r"</literal> (or <literal>1</literal>) or <literal>"c"</literal> (or <literal>2</literal>)
+                    </para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>m</term>
+                <listitem>
+                    <para>real scalar, vector or hypermatrix, the a priori mean</para>
+                </listitem>
+            </varlistentry>
+        </variablelist>
+    </refsection>
+    <refsection>
+        <title>Description</title>
+        <para>
+            stdev computes the "sample" standard deviation, that
+            is, it is normalized by N-1, where N is the sequence length.
+            If <varname>m</varname> is present, then <code>stdev</code> computes the
+            mean squared deviation (normalized by N) using the a priori mean defined by <varname>m</varname>.
+        </para>
+        <para>
+            For a vector or a matrix <literal>x</literal>, <literal>y=stdev(x)</literal> returns in the
+            scalar <literal>y</literal> the standard deviation of all the entries of <literal>x</literal>.
+        </para>
+        <para>
+            <literal>y=stdev(x,'r')</literal> (or, equivalently,
+            <literal>y=stdev(x,1)</literal>) is the rowwise standard deviation. It returns in each
+            entry of the row vector <literal>y</literal> the standard deviation of each column of <literal>x</literal>.
+        </para>
+        <para>
+            <literal>y=stdev(x,'c')</literal> (or, equivalently, <literal>y=stdev(x,2)</literal>) is the columnwise stdev. It returns in each
+            entry of the column vector <literal>y</literal> the standard deviation of each row of <literal>x</literal>.
+        </para>
+        <para>
+            By extension, <literal>y=stdev(x,n)</literal> with <literal>n</literal> a positive integer returns the deviation
+            along the <literal>n</literal>-th dimension, and if <literal>n>ndims(x)</literal>, then <literal>stdev(x,n)</literal> returns <literal>zeros(x)</literal>.
+        </para>
+        <note>
+            If <varname>m</varname> is a scalar, then it is expanded to match the size of <code>mean(x)</code> along the <literal>n</literal>-th dimension.
+        </note>
+    </refsection>
+    <refsection>
+        <title>Examples</title>
+        <programlisting role="example"><![CDATA[
+A = [1 2 10; 7 7.1 7.01];
+stdev(A)
+stdev(A, 'r')
+stdev(A, 'c')
+stdev(A, 'c', mean(A,'c'))
+stdev(A, 'c', 1)
+ ]]></programlisting>
+    </refsection>
+    <refsection role="see also">
+        <title>See Also</title>
+        <simplelist type="inline">
+            <member>
+                <link linkend="nanstdev">nanstdev</link>
+            </member>
+            <member>
+                <link linkend="stdevf">stdevf</link>
+            </member>
+            <member>
+                <link linkend="sum">sum</link>
+            </member>
+            <member>
+                <link linkend="median">median</link>
+            </member>
+            <member>
+                <link linkend="mean">mean</link>
+            </member>
+        </simplelist>
+    </refsection>
+    <refsection>
+        <title>History</title>
+        <revhistory>
+            <revision>
+                <revnumber>5.5.0</revnumber>
+                <revdescription>
+                    Can now compute the mean squared deviation using the a priori mean defined by <varname>m</varname>
+                </revdescription>
+            </revision>
+        </revhistory>
+    </refsection>
+</refentry>
index 06338eb..faada8f 100644 (file)
@@ -1,19 +1,22 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- * Copyright (C) 2000 - INRIA 
- * 
+ * Copyright (C) 2000 - INRIA
+ *
  * 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    
+ * are also available at
  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
  *
  -->
 <refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org" xml:lang="fr" xml:id="st_deviation">
     <refnamediv>
         <refname>st_deviation</refname>
-        <refpurpose>écart-type des termes d'une matrice  </refpurpose>
+        <refpurpose>
+            écart-type des termes d'une matrice
+            <emphasis role="bold">Cette fonction est obsolète.</emphasis>
+        </refpurpose>
     </refnamediv>
     <refnamediv xml:id="stdev">
         <refname>stdev</refname>
     </refsection>
     <refsection>
         <title>Description</title>
+        <warning>
+            Cette fonction est <emphasis role="bold">obsolète</emphasis>,
+            utilisez <link linkend="stdev">stdev</link> à la place.
+        </warning>
         <para>
             st_deviation calcule l'estimateur sans biais de l'écart-type (normalisé par N-1, ou N est le nombre d'échantillons).
         </para>
@@ -67,7 +74,7 @@
     </refsection>
     <refsection>
         <title>Exemples</title>
-        <programlisting role="example"><![CDATA[ 
+        <programlisting role="example"><![CDATA[
 A=[1,2,10;7,7.1,7.01];
 st_deviation(A)
 st_deviation(A,'r')
@@ -94,4 +101,15 @@ st_deviation(A,'c')
             </member>
         </simplelist>
     </refsection>
+    <refsection>
+        <title>History</title>
+        <revhistory>
+            <revision>
+                <revnumber>5.5.0</revnumber>
+                <revdescription>
+                    Fonction obsolète. Sera supprimée dans la version 5.5.1. Veuillez utiliser <link linkend="stdev">stdev</link> à la place.
+                </revdescription>
+            </revision>
+        </revhistory>
+    </refsection>
 </refentry>
diff --git a/scilab/modules/statistics/help/fr_FR/descriptive_statistics/stdev.xml b/scilab/modules/statistics/help/fr_FR/descriptive_statistics/stdev.xml
new file mode 100644 (file)
index 0000000..9a03fab
--- /dev/null
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2000 - INRIA
+ *
+ * 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
+ *
+ -->
+<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org" xml:lang="fr" xml:id="stdev">
+    <refnamediv>
+        <refname>stdev</refname>
+        <refpurpose>écart-type des termes d'une matrice</refpurpose>
+    </refnamediv>
+    <refsynopsisdiv>
+        <title>Séquence d'appel</title>
+        <synopsis>
+            y = stdev(x)
+            y = stdev(x, '*')
+            y = stdev(x, 'r')
+            y = stdev(x, 'c')
+            y = stdev(x, orien, m)
+        </synopsis>
+    </refsynopsisdiv>
+    <refsection>
+        <title>Paramètres</title>
+        <variablelist>
+            <varlistentry>
+                <term>x</term>
+                <listitem>
+                    <para>vecteur, matrice ou hypermatrice réelle
+                    </para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>y</term>
+                <listitem>
+                    <para>scalaire, vecteur ou matrice réelle
+                    </para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>orien</term>
+                <listitem>
+                    <para>
+                        caractère, peut valoir <literal>"*"</literal>, <literal>"r"</literal> ou <literal>"c"</literal>
+                    </para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>m</term>
+                <listitem>
+                    <para>réel : scalaire, vecteur ou hypermatrice, la moyenne a priori</para>
+                </listitem>
+            </varlistentry>
+        </variablelist>
+    </refsection>
+    <refsection>
+        <title>Description</title>
+        <para>
+            stdev calcule l'estimateur sans biais de l'écart-type (normalisé par N-1, ou N est le nombre d'échantillons).
+            Si <varname>m</varname> est présent, alors <code>stdev</code> retourne l'écart quadratique moyen, normalisé par N,
+            en utilisant la moyenne a priori définie par <varname>m</varname>.
+        </para>
+        <para>
+            Pour un vecteur ou une matrice <literal>x</literal>, <literal>y=stdev(x)</literal> renvoie dans <literal>y</literal> l'écart-type des termes de <literal>x</literal>.
+        </para>
+        <para>
+            <literal>y=stdev(x,'r')</literal> (ou <literal>y=stdev(x,1)</literal>) est l'écart-type suivant l'indice de ligne. Chaque composante du vecteur ligne <literal>y</literal> contient l'écart-type de chaque colonne de <literal>x</literal>.
+        </para>
+        <para>
+        </para>
+        <para>
+            <literal>y=stdev(x,'c')</literal> (ou <literal>y=stdev(x,2)</literal>) est l'écart-type selon l'indice de colonne. Chaque composante du vecteur colonne <literal>y</literal> contient l'écart-type de chaque ligne de <literal>x</literal>.
+        </para>
+        <para>
+            Par extension, <literal>y=stdev(x,n)</literal> avec <literal>n</literal> un entier positif retourne la déviation
+            suivant la <literal>n</literal>-ème dimension, et si <literal>n>ndims(x)</literal>, alors <literal>stdev(x,n)</literal> retourne <literal>zeros(x)</literal>.
+        </para>
+    </refsection>
+    <refsection>
+        <title>Exemples</title>
+        <programlisting role="example"><![CDATA[
+A = [1 2 10; 7 7.1 7.01];
+stdev(A)
+stdev(A, 'r')
+stdev(A, 'c')
+stdev(A, 'c', mean(x,'c'))
+ ]]></programlisting>
+    </refsection>
+    <refsection role="see also">
+        <title>Voir aussi</title>
+        <simplelist type="inline">
+            <member>
+                <link linkend="nanstdev">nanstdev</link>
+            </member>
+            <member>
+                <link linkend="stdevf">stdevf</link>
+            </member>
+            <member>
+                <link linkend="sum">sum</link>
+            </member>
+            <member>
+                <link linkend="median">median</link>
+            </member>
+            <member>
+                <link linkend="mean">mean</link>
+            </member>
+        </simplelist>
+    </refsection>
+    <refsection>
+        <title>Historique</title>
+        <revhistory>
+            <revision>
+                <revnumber>5.5.0</revnumber>
+                <revdescription>
+                    Peut désormais calculer l'écart-type moyen quadratique en utilisant la moyenne a priori définie par <varname>m</varname>
+                </revdescription>
+            </revision>
+        </revhistory>
+    </refsection>
+</refentry>
index f444a22..be9cb06 100644 (file)
@@ -1,4 +1,5 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Paul Bignier: made obsolete, merged in stdev
 // Copyright (C) 1999 - INRIA - Carlos Klimann
 //
 // This file must be used under the terms of the CeCILL.
@@ -29,6 +30,8 @@ function m=msd(x,orien)
     //5th edition, John Wiley, 1990.
     //
     //
+    warnobsolete("stdev", "5.5.1");
+
     rhs=argn(2)
     if rhs==0 then error(msprintf(gettext("%s: Wrong number of input argument: At least %d expected.\n"),"msd",1)), end
     if x==[] then s=%nan, return, end
index f609771..d79c16d 100644 (file)
@@ -1,4 +1,5 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Paul Bignier: made obsolete, merged in stdev
 // Copyright (C) XXXX - INRIA
 // Copyright (C) XXXX - ENPC
 // Copyright (C) XXXX - Ecole des Mines de Nantes - Philippe Castagliola
 
 function sd=st_deviation(x,cr)
     //
+    warnobsolete("stdev", "5.5.1");
     if argn(2)<2 then cr="*",end
     if x == [] then sd=%nan;return ;end
-    if typeof(x)=="hypermat" then sd=%hm_st_deviation(x,cr),return,end
+    if typeof(x)=="hypermat" then sd=%hm_stdev(x,cr),return,end
     [m,n]=size(x);
     if cr=="*" then
         n=m*n
index c39ab96..5113793 100644 (file)
@@ -1,4 +1,6 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enteprises - Paul Bignier: added mean squared deviation
+//                                                        (third input argument)
 // Copyright (C) 2000 - INRIA - Carlos Klimann
 //
 // This file must be used under the terms of the CeCILL.
@@ -8,7 +10,7 @@
 // http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
 //
 
-function sd=stdev(x,o)
+function sd = stdev(x, o, m)
     //
     //This function computes  the  standard deviation  of  the values  of  a
     //vector or matrix x.
@@ -24,27 +26,122 @@ function sd=stdev(x,o)
     //standard  deviation. It returns in each  entry of the  column vector y
     //the standard deviation of each row of x.
     //
+    //The input argument m represents the a priori mean. If it is present, then the sum is
+    //divided by size(x,"*"). Otherwise ("sample standard deviation"), it is divided by size(x,"*")-1.
     //
-    if argn(2)<2 then o="*",end
-    if x == [] then sd=%nan;return ;end
-
-    if typeof(x)=="hypermat" then sd=%hm_st_deviation(x,o),return,end
-
-    // remove the mean
-    if o=="*" then
-        y=x - mean(x)
-    elseif o=="c"|o==2 then
-        y=x - mean(x,"c")*ones(x(1,:))
-    elseif o=="r"|o==1 then
-        y=x - ones(x(:,1))*mean(x,"r")
+
+    [lhs, rhs] = argn(0);
+
+    if rhs < 2 then
+        o = "*"
+        on = 0
     else
-        error(msprintf(gettext("%s: Wrong value for input argument #%d: ''%s'', ''%s'', ''%s'', %d or %d expected.\n"),"stdev",2,"*","c","r",1,2)),
+        select o
+        case "*" then
+            on = 0
+        case "r" then
+            on = 1
+        case "c" then
+            on = 2
+        else
+            if type(o) <> 1 | size(o, "*") <> 1 | o < 0 | floor(o) <> o then
+                error(msprintf(gettext("%s: Wrong value for input argument #%d: ''%s'',''%s'', ''%s'' or a positive integer expected.\n"),"stdev",2,"*","r","c")),
+            else
+                on = o
+            end
+        end
+    end
+
+    if typeof(x) == "hypermat" then
+        if rhs == 3 then
+            sd = %hm_stdev(x, o, m);
+        else
+            sd = %hm_stdev(x, o);
+        end
+        return
+    end
+
+    if type(x) ~= 1 | ~isreal(x) then
+        tmp = _("%s: Wrong type for input argument #%d: A real matrix expected.\n")
+        error(msprintf(tmp, "stdev", 1))
+    end
+
+    siz = size(x);
+    if rhs == 3 then
+        if and(typeof(m) ~= ["constant" "hypermat"]) | ~isreal(m) then
+            tmp = _("%s: Wrong type for input argument #%d: A real matrix expected.\n")
+            error(msprintf(tmp, "stdev", 3))
+        elseif on == 0 then
+            if ~isscalar(m) then
+                tmp = _("%s: Wrong size for input argument #%d.\n")
+                error(msprintf(tmp, "stdev", 3))
+            end
+        elseif on == 1 then
+            if or(size(m) ~= [1 siz(2:$)]) then
+                if isscalar(m) then
+                    m = resize_matrix(m, [1 siz(2:$)], m);
+                else
+                    tmp = _("%s: Wrong size for input argument #%d.\n")
+                    error(msprintf(tmp, "stdev", 3))
+                end
+            end
+        elseif on == 2 then
+            if or(size(m) ~= [siz(1) 1 siz(3:$)]) then
+                if isscalar(m) then
+                    m = resize_matrix(m, [siz(1) 1 siz(3:$)], m);
+                else
+                    tmp = _("%s: Wrong size for input argument #%d.\n")
+                    error(msprintf(tmp, "stdev", 3))
+                end
+            end
+        end
     end
 
-    if size(x,o)==1 then
-        sd=0*y
+    if x == [] then
+        sd = %nan;
+        return
+    end
+
+    if rhs == 3 & isnan(m) then
+        // This will compute the "biased variance": the denominator will be size(x,orien)
+        // but the a priori mean is not considered as provided.
+        rhs = 2
+    end
+
+    // Remove the mean
+    if on == 0 then
+        if rhs == 3
+            y = x - m;
+        else
+            y = x - mean(x);
+        end
+    elseif on == 2 then
+        if rhs == 3
+            y = x - m*ones(x(1,:));
+        else
+            y = x - mean(x,on)*ones(x(1,:));
+        end
+    elseif on == 1 then
+        if rhs == 3
+            y = x - ones(x(:,1))*m;
+        else
+            y = x - ones(x(:,1))*mean(x,1);
+        end
+    else // on > ndims(x) then
+        sd = 0*x;
+        return
+    end
+
+    mn = size(x, o);
+
+    if mn == 1 then
+        sd = 0*y;
     else
-        sd=sqrt(sum(y.^2,o)/(size(x,o)-1));
+        if rhs <= 2 & exists("m", "local") == 0 then // If m is provided but rhs=2, that means we want the biased deviation
+            sd = sqrt(sum(y.^2,o)/(mn-1));
+        else
+            sd = sqrt(sum(y.^2,o)/mn);
+        end
     end
 
 endfunction
index 68b4571..d641cd8 100644 (file)
@@ -1,3 +1,9 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2006-2008 - INRIA -Serge STEER <serge.steer@inria.fr>
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
 // <-- Non-regression test for bug 1742 -->
 //
 // <-- Bugzilla URL -->
 //
 //    This formula is wrong. Must be canged in:
 //    m=sqrt(sum((x-ones(x(:,1))*mean(x,'r')).^2,'r')/nrow);
-// Copyright INRIA
-// Scilab Project - Serge Steer
-// Copyright INRIA 2006
-// Date : 4 mai 2006
 x=matrix([5 2:8],2,4);
 if (msd(x)-3.5)                  >= %eps then bugmes();quit;end
+WARNING: Feature msd is obsolete.
+WARNING: Please use stdev instead.
+WARNING: This feature will be permanently removed in Scilab 5.5.1
+
 if norm(msd(x,1)-[3 1 1 1]/2)    >= %eps then bugmes();quit;end
+WARNING: Feature msd is obsolete.
+WARNING: Please use stdev instead.
+WARNING: This feature will be permanently removed in Scilab 5.5.1
+
 if norm(msd(x,'r')-[3 1 1 1]/2)  >= %eps then bugmes();quit;end
+WARNING: Feature msd is obsolete.
+WARNING: Please use stdev instead.
+WARNING: This feature will be permanently removed in Scilab 5.5.1
+
 if norm(msd(x,2)-sqrt([2;5]))    >= %eps then bugmes();quit;end
+WARNING: Feature msd is obsolete.
+WARNING: Please use stdev instead.
+WARNING: This feature will be permanently removed in Scilab 5.5.1
+
 if norm(msd(x,'c')-sqrt([2;5]))  >= %eps then bugmes();quit;end
+WARNING: Feature msd is obsolete.
+WARNING: Please use stdev instead.
+WARNING: This feature will be permanently removed in Scilab 5.5.1
+
index 05564b4..34fa236 100644 (file)
@@ -1,3 +1,9 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2007-2008 - INRIA -Pierre MARECHAL <pierre.marechal@inria.fr>
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
 // <-- Non-regression test for bug 2407 -->
 //
 // <-- Bugzilla URL -->
@@ -18,9 +24,6 @@
 //    the problem.
 //
 //    Regards.
-// Author : Scilab Project - Pierre MARECHAL
-// Copyright INRIA
-// Date : 05 mai 2007
 a = zeros(3,3,3);
 b = stdev(a);
 if b <> 0 then bugmes();quit;end
diff --git a/scilab/modules/statistics/tests/nonreg_tests/bug_7593.dia.ref b/scilab/modules/statistics/tests/nonreg_tests/bug_7593.dia.ref
new file mode 100644 (file)
index 0000000..6e2b070
--- /dev/null
@@ -0,0 +1,57 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Paul Bignier
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 7593 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=7593
+//
+// <-- Short Description -->
+// The function st_deviation was merged into stdev (they were duplicates),
+// and msd is now accessible through the third input argument of stdev
+x = matrix([5 2:8], 2, 4);
+assert_checkalmostequal(stdev(x,"*",mean(x)), 1.870828693387);
+assert_checkalmostequal(norm(stdev(x,1,mean(x,"r"))-[3 1 1 1]/2),   0);
+assert_checkalmostequal(norm(stdev(x,"r",mean(x,"r"))-[3 1 1 1]/2), 0);
+assert_checkalmostequal(norm(stdev(x,2,mean(x,"c"))-sqrt([2;5])),   0);
+assert_checkalmostequal(norm(stdev(x,"c",mean(x,"c"))-sqrt([2;5])), 0);
+// Biased deviation
+assert_checkalmostequal(stdev(x,"*",%nan), 1.870828693387);
+assert_checkalmostequal(norm(stdev(x,1,%nan)-[3 1 1 1]/2),   0);
+assert_checkalmostequal(norm(stdev(x,"r",%nan)-[3 1 1 1]/2), 0);
+assert_checkalmostequal(norm(stdev(x,2,%nan)-sqrt([2;5])),   0);
+assert_checkalmostequal(norm(stdev(x,"c",%nan)-sqrt([2;5])), 0);
+// With scalar means
+rand("seed", 0);
+x = rand(3, 10) + 0.5;
+refR = [
+0.364541128374
+0.155589477734
+0.316156843180
+0.268553719068
+0.219155131832
+0.273506665569
+0.262844435686
+0.318334990307
+0.149138182829
+0.111372370623 ]';
+refC = [
+0.299608392744
+0.216862008097
+0.245620889607 ];
+assert_checkalmostequal(stdev(x, "*", 1), 0.256335678990);
+assert_checkalmostequal(stdev(x, 1, 1),   refR);
+assert_checkalmostequal(stdev(x, "r", 1), refR);
+assert_checkalmostequal(stdev(x, 2, 1),   refC);
+assert_checkalmostequal(stdev(x, "c", 1), refC);
+// Error checks
+refMsg = msprintf(_("%s: Wrong size for input argument #%d.\n"),"stdev",3);
+assert_checkerror("stdev(x, ""*"", [1 1])",   refMsg);
+refMsg = msprintf(_("%s: Wrong type for input argument #%d: A real matrix expected.\n"),"stdev",3);
+assert_checkerror("stdev(x, ""*"", ""msd"")", refMsg);
diff --git a/scilab/modules/statistics/tests/nonreg_tests/bug_7593.tst b/scilab/modules/statistics/tests/nonreg_tests/bug_7593.tst
new file mode 100644 (file)
index 0000000..0c4ae60
--- /dev/null
@@ -0,0 +1,63 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Paul Bignier
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 7593 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=7593
+//
+// <-- Short Description -->
+// The function st_deviation was merged into stdev (they were duplicates),
+// and msd is now accessible through the third input argument of stdev
+
+x = matrix([5 2:8], 2, 4);
+
+assert_checkalmostequal(stdev(x,"*",mean(x)), 1.870828693387);
+assert_checkalmostequal(norm(stdev(x,1,mean(x,"r"))-[3 1 1 1]/2),   0);
+assert_checkalmostequal(norm(stdev(x,"r",mean(x,"r"))-[3 1 1 1]/2), 0);
+assert_checkalmostequal(norm(stdev(x,2,mean(x,"c"))-sqrt([2;5])),   0);
+assert_checkalmostequal(norm(stdev(x,"c",mean(x,"c"))-sqrt([2;5])), 0);
+
+// Biased deviation
+assert_checkalmostequal(stdev(x,"*",%nan), 1.870828693387);
+assert_checkalmostequal(norm(stdev(x,1,%nan)-[3 1 1 1]/2),   0);
+assert_checkalmostequal(norm(stdev(x,"r",%nan)-[3 1 1 1]/2), 0);
+assert_checkalmostequal(norm(stdev(x,2,%nan)-sqrt([2;5])),   0);
+assert_checkalmostequal(norm(stdev(x,"c",%nan)-sqrt([2;5])), 0);
+
+// With scalar means
+rand("seed", 0);
+x = rand(3, 10) + 0.5;
+refR = [
+0.364541128374
+0.155589477734
+0.316156843180
+0.268553719068
+0.219155131832
+0.273506665569
+0.262844435686
+0.318334990307
+0.149138182829
+0.111372370623 ]';
+refC = [
+0.299608392744
+0.216862008097
+0.245620889607 ];
+assert_checkalmostequal(stdev(x, "*", 1), 0.256335678990);
+assert_checkalmostequal(stdev(x, 1, 1),   refR);
+assert_checkalmostequal(stdev(x, "r", 1), refR);
+assert_checkalmostequal(stdev(x, 2, 1),   refC);
+assert_checkalmostequal(stdev(x, "c", 1), refC);
+
+
+// Error checks
+refMsg = msprintf(_("%s: Wrong size for input argument #%d.\n"),"stdev",3);
+assert_checkerror("stdev(x, ""*"", [1 1])",   refMsg);
+refMsg = msprintf(_("%s: Wrong type for input argument #%d: A real matrix expected.\n"),"stdev",3);
+assert_checkerror("stdev(x, ""*"", ""msd"")", refMsg);
index 2bd2b29..9173d14 100644 (file)
@@ -7,6 +7,50 @@
 // =============================================================================
 // Tests for standard deviation
 // =============================================================================
-if stdev(0) <> 0 then bugmes();quit;end
-if stdev(zeros(3,3)) <> 0 then bugmes();quit;end
-if stdev(zeros(3,3,3)) <> 0 then bugmes();quit;end
+assert_checkequal(stdev(0), 0);
+assert_checkequal(stdev(zeros(3,3)), 0);
+assert_checkequal(stdev(zeros(3,3,3)), 0);
+// stdev returns 0 when asking for singleton dimensions
+assert_checkequal(stdev(1, 1), 0);
+assert_checkequal(stdev(1, 2), 0);
+assert_checkequal(stdev(ones(3,3), 3), zeros(3,3));
+assert_checkequal(stdev(ones(3,3,3), 4), zeros(3,3,3));
+rand("seed", 0);
+a = rand(3, 3, 3);
+refY = 0.272002431404198;
+y0 = stdev(a);
+ys = stdev(a, "*");
+assert_checkalmostequal(y0, refY);
+assert_checkalmostequal(ys, refY);
+refY = [0.3899896462733005  0.1836990129394737  0.1038925147784040];
+refY(:, :, 2) = [0.3177134004419370  0.2681129484277341  0.0087779568439578];
+refY(:, :, 3) = [0.2897656318619816  0.3895404996160437  0.1425603832951185];
+y1 = stdev(a, 1);
+yr = stdev(a, "r");
+assert_checkalmostequal(y1, refY);
+assert_checkalmostequal(yr, refY);
+refY = [0.3394940617212404 ; 0.0475705580641355 ; 0.4523801086433633];
+refY(:, :, 2) = [0.342549229474548 ; 0.2004197906845895 ; 0.2310186249368761];
+refY(:, :, 3) = [0.3165165021017580 ; 0.2336663995922139 ; 0.1479958923819589];
+y2 = stdev(a, 2);
+yc = stdev(a, "c");
+assert_checkalmostequal(y2, refY);
+assert_checkalmostequal(yc, refY);
+// Mean squared deviation
+refY = 0.2669178254690693;
+ys = stdev(a, "*", mean(a));
+assert_checkalmostequal(ys, refY);
+refY = [0.3184252127793632  0.1499896159848785  0.0848278831005502];
+refY(:, :, 2) = [0.2594119051757631  0.2189133056936967  0.0071671717506227];
+refY(:, :, 3) = [0.2365926476856702  0.3180584860693779  0.1164000655362104];
+y1 = stdev(a, 1, mean(a,"r"));
+yr = stdev(a, "r", mean(a,"r"));
+assert_checkalmostequal(y1, refY);
+assert_checkalmostequal(yr, refY);
+refY = [0.2771957406406592 ; 0.0388411980121906 ; 0.3693668119870194];
+refY(:, :, 2) = [0.2796902746653962 ; 0.1636420738442178 ; 0.1886259173915840];
+refY(:, :, 3) = [0.2584346417732888 ; 0.1907878163447345 ; 0.1208381401212172];
+y2 = stdev(a, 2, mean(a,"c"));
+yc = stdev(a, "c", mean(a,"c"));
+assert_checkalmostequal(y2, refY);
+assert_checkalmostequal(yc, refY);
index 3e4a841..56c14ed 100644 (file)
@@ -9,6 +9,58 @@
 // Tests for standard deviation
 // =============================================================================
 
-if stdev(0) <> 0 then pause,end
-if stdev(zeros(3,3)) <> 0 then pause,end
-if stdev(zeros(3,3,3)) <> 0 then pause,end
+assert_checkequal(stdev(0), 0);
+assert_checkequal(stdev(zeros(3,3)), 0);
+assert_checkequal(stdev(zeros(3,3,3)), 0);
+// stdev returns 0 when asking for singleton dimensions
+assert_checkequal(stdev(1, 1), 0);
+assert_checkequal(stdev(1, 2), 0);
+assert_checkequal(stdev(ones(3,3), 3), zeros(3,3));
+assert_checkequal(stdev(ones(3,3,3), 4), zeros(3,3,3));
+
+rand("seed", 0);
+a = rand(3, 3, 3);
+refY = 0.272002431404198;
+
+y0 = stdev(a);
+ys = stdev(a, "*");
+assert_checkalmostequal(y0, refY);
+assert_checkalmostequal(ys, refY);
+
+refY = [0.3899896462733005  0.1836990129394737  0.1038925147784040];
+refY(:, :, 2) = [0.3177134004419370  0.2681129484277341  0.0087779568439578];
+refY(:, :, 3) = [0.2897656318619816  0.3895404996160437  0.1425603832951185];
+y1 = stdev(a, 1);
+yr = stdev(a, "r");
+assert_checkalmostequal(y1, refY);
+assert_checkalmostequal(yr, refY);
+
+refY = [0.3394940617212404 ; 0.0475705580641355 ; 0.4523801086433633];
+refY(:, :, 2) = [0.342549229474548 ; 0.2004197906845895 ; 0.2310186249368761];
+refY(:, :, 3) = [0.3165165021017580 ; 0.2336663995922139 ; 0.1479958923819589];
+y2 = stdev(a, 2);
+yc = stdev(a, "c");
+assert_checkalmostequal(y2, refY);
+assert_checkalmostequal(yc, refY);
+
+// Mean squared deviation
+
+refY = 0.2669178254690693;
+ys = stdev(a, "*", mean(a));
+assert_checkalmostequal(ys, refY);
+
+refY = [0.3184252127793632  0.1499896159848785  0.0848278831005502];
+refY(:, :, 2) = [0.2594119051757631  0.2189133056936967  0.0071671717506227];
+refY(:, :, 3) = [0.2365926476856702  0.3180584860693779  0.1164000655362104];
+y1 = stdev(a, 1, mean(a,"r"));
+yr = stdev(a, "r", mean(a,"r"));
+assert_checkalmostequal(y1, refY);
+assert_checkalmostequal(yr, refY);
+
+refY = [0.2771957406406592 ; 0.0388411980121906 ; 0.3693668119870194];
+refY(:, :, 2) = [0.2796902746653962 ; 0.1636420738442178 ; 0.1886259173915840];
+refY(:, :, 3) = [0.2584346417732888 ; 0.1907878163447345 ; 0.1208381401212172];
+y2 = stdev(a, 2, mean(a,"c"));
+yc = stdev(a, "c", mean(a,"c"));
+assert_checkalmostequal(y2, refY);
+assert_checkalmostequal(yc, refY);