*Bug #7848 fixed - The third argument of correl function is now optional. 01/12101/2
Adeline CARNIS [Mon, 22 Jul 2013 15:35:51 +0000 (17:35 +0200)]
Change-Id: I3f1b2bb8a5132a797b77f299678deefd1a8e4a2c

scilab/CHANGES_5.5.X
scilab/modules/statistics/help/en_US/descriptive_statistics/correl.xml
scilab/modules/statistics/macros/correl.sci
scilab/modules/statistics/tests/nonreg_tests/bug_7848.dia.ref [new file with mode: 0644]
scilab/modules/statistics/tests/nonreg_tests/bug_7848.tst [new file with mode: 0644]
scilab/modules/statistics/tests/unit_tests/correl.dia.ref [new file with mode: 0644]
scilab/modules/statistics/tests/unit_tests/correl.tst [new file with mode: 0644]

index eaf4298..6e6384f 100644 (file)
@@ -228,6 +228,8 @@ Bug fixes
 
 * Bug #7828 fixed - Slight improvements in nicholschart.
 
+* Bug #7848 fixed - The third argument of correl function is now optional.
+
 * Bug #7927 fixed - Output "flag" in qmr function was not well documented.
 
 * Bug #7960 fixed - plzr() could not produce pole zero plot for a simple transfer function.
index b57144e..78fa68d 100644 (file)
@@ -2,11 +2,11 @@
 <!--
  * 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    
+ * are also available at
  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
  *
  -->
@@ -17,7 +17,7 @@
     </refnamediv>
     <refsynopsisdiv>
         <title>Calling Sequence</title>
-        <synopsis>rho=correl(x,y,fre)</synopsis>
+        <synopsis>rho=correl(x, y [, fre])</synopsis>
     </refsynopsisdiv>
     <refsection>
         <title>Arguments</title>
             <varlistentry>
                 <term>x</term>
                 <listitem>
-                    <para>real or complex vector</para>
+                    <para>real or complex vector.</para>
                 </listitem>
             </varlistentry>
             <varlistentry>
                 <term>y</term>
                 <listitem>
-                    <para>real or complex vector</para>
+                    <para>real or complex vector.</para>
                 </listitem>
             </varlistentry>
             <varlistentry>
                 <term>fre</term>
                 <listitem>
-                    <para>matrix of type length(x) x length(y)</para>
+                    <para>matrix of type length(x) x length(y). (Optional)</para>
                 </listitem>
             </varlistentry>
         </variablelist>
     <refsection>
         <title>Description</title>
         <para>
-            <literal>correl(x,y,fre)</literal>  computes the correlation of two variables x and y.
-            fre is a matrix of dimensions  length(x) x length(y). In fre the element
-            of indices (i,j) corresponds to the value or number or frequences of
-            x_i&amp;y_j.
+            <literal>correl(x,y)</literal> or <literal>correl(x,y, fre)</literal> computes the 
+            correlation of two variables <literal>x</literal> and <literal>y</literal>.
+        </para>
+        <para>
+            If you use correl(x,y), <literal>x</literal> and <literal>y</literal> must be the same
+            size (size(x, "*") must be equal to size(y, "*")).
+        </para>
+        <para>
+            <literal>fre</literal> is a matrix of dimensions  length(x) x length(y). In 
+            <literal>fre</literal>, the element of indices (i,j) corresponds to the value or 
+            number or frequences of x_i&amp;y_j.
         </para>
     </refsection>
     <refsection>
     <refsection>
         <title>Examples</title>
         <programlisting role="example"><![CDATA[ 
-x=[2.5 7.5 12.5 17.5]
-h=[0 1 2]
-fre=[.03 .12 .07;.02 .13 .11;.01 .13 .14;.01 .09 .14]
-rho=correl(x,h,fre)
+        // correl(x, y)
+        x = [2.5 7.5 12.5 17.5];
+        y = [6.3 7.1 8.2 9.4];
+        r = correl(x, y)
+        
+        // correl(x, y, fre)
+        h=[0 1 2]
+        fre=[.03 .12 .07;.02 .13 .11;.01 .13 .14;.01 .09 .14]
+        rho=correl(x,h,fre)
  ]]></programlisting>
     </refsection>
     <refsection role="see also">
@@ -74,4 +86,15 @@ rho=correl(x,h,fre)
             </member>
         </simplelist>
     </refsection>
+    <refsection>
+        <title>History</title>
+        <revhistory>
+            <revision>
+                <revnumber>5.5.0</revnumber>
+                <revremark>
+                    Third input argument is now optional.
+                </revremark>
+            </revision>
+        </revhistory>
+    </refsection>
 </refentry>
index dfcef20..3dde010 100644 (file)
@@ -1,6 +1,6 @@
-
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) 2000 - INRIA - Carlos Klimann
+// Copyright (C) 2013 - Scilab Enterprises - Adeline CARNIS
 //
 // This file must be used under the terms of the CeCILL.
 // This source file is licensed as described in the file COPYING, which
@@ -9,7 +9,7 @@
 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
 //
 
-function rho=correl(x,y,fre)
+function rho=correl(varargin)
     //
     //This function computes  the correlation of two variables x
     //and y where x is  a numerical vector of length  n, y is  a
@@ -21,30 +21,61 @@ function rho=correl(x,y,fre)
     //J.Wiley & Sons, 1990.
     //
     //
-    if x==[] | y==[] then s=%nan; return, end
-    [lhs,rhs]=argn(0)
-    if rhs <> 3 then error(msprintf(gettext("%s: Wrong number of input arguments: %d expected.\n"),"correl",3)), end
-    [lfre,cfre]=size(fre);
-    [lx,cx]=size(x)
-    [ly,cy]=size(y)
-
-    if lx<>1 & cx<>1 then error(msprintf(gettext("%s: Wrong type for input argument #%d: Vector expected.\n"),"correl",1)), end
-    if ly<>1 & cy<>1 then error(msprintf(gettext("%s: Wrong type for input argument #%d: Vector expected.\n"),"correl",2)), end
-    lx=lx*cx;
-    cy=ly*cy;
-
-
-    if lx<>lfre then error(msprintf(gettext("%s: Wrong value for input argument #%d: Same number of line as first input argument expected.\n"),"correl",3)), end
-    if cy<>cfre then error(msprintf(gettext("%s: Wrong value for input argument #%d: Same number of column as first input argument expected.\n"),"correl",3)), end
-    x=matrix(x,lx,1);
-    y=matrix(y,1,cy);
-    fr=fre/sum(fre)
-    px=sum(fr,"c")
-    py=sum(fr,"r")
-    mx=sum(x .* px)
-    my=sum(y .* py)
-    sx=sqrt(sum(((x-mx).^2).*px))
-    sy=sqrt(sum(((y-my).^2).*py))
-    sxy=sum(((x-mx)*ones(1,cy)).*fr.*(ones(lx,1)*(y-my)))
-    rho=sxy/(sx*sy)
+    rhs = argn(2);
+    if rhs < 2 | rhs > 3 then
+        error(msprintf(gettext("%s: Wrong number of input arguments: %d to %d expected.\n"),"correl",2,3));
+    end
+
+    x = varargin(1);
+    y = varargin(2);
+    
+    if type(x) <> 1 | ~isvector(x) then
+        error(msprintf(gettext("%s: Wrong type for input argument #%d: Vector expected.\n"),"correl",1));
+    end
+
+    if type(y) <> 1 | ~isvector(y) then
+        error(msprintf(gettext("%s: Wrong type for input argument #%d: Vector expected.\n"),"correl",2));
+    end
+
+    if isempty(x) | isempty(y) then
+        rho = %nan
+        return;
+    end
+
+    cx = size(x, "*");
+    ly = size(y, "*");
+    x=matrix(x,1,cx);
+    y=matrix(y,ly,1);
+
+    if rhs == 2 then
+        if cx <> ly then
+            error(msprintf(gettext("%s: Incompatible input arguments #%d and #%d: Same sizes expected"), "correl", 1, 2));
+        end
+        mx = mean(x);
+        my = mean(y);
+        sx = sqrt(sum((x-mx).^2))
+        sy = sqrt(sum((y-my).^2))
+        rho = (x-mx)*(y-my) / (sx*sy);
+    else
+        fre = varargin(3);
+        [lfre, cfre] = size(fre);
+
+        if cx <> lfre then 
+            error(msprintf(gettext("%s: Wrong value for input argument #%d: Same number of line as first input argument expected.\n"),"correl",3));
+        end
+        if ly <>cfre then 
+            error(msprintf(gettext("%s: Wrong value for input argument #%d: Same number of column as first input argument expected.\n"),"correl",3));
+        end
+
+        fr=fre/sum(fre)
+        px=sum(fr,'c')
+        py=sum(fr,'r')
+        mx = x * px;
+        my = py*y;
+        sx = sqrt(((x-mx).^2)*px);
+        sy = sqrt(py*((y-my).^2));
+        sxy = sum((x-mx)*fr*(y-my));
+        rho=sxy/(sx*sy)
+    end
+
 endfunction
diff --git a/scilab/modules/statistics/tests/nonreg_tests/bug_7848.dia.ref b/scilab/modules/statistics/tests/nonreg_tests/bug_7848.dia.ref
new file mode 100644 (file)
index 0000000..c22d873
--- /dev/null
@@ -0,0 +1,31 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Adeline CARNIS
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+// <-- Non-regression test for bug 7848 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=7848
+//
+// <-- Short Description -->
+//    The third argument of correl function is now optional.
+// =============================================================================
+r = correl(1:10, 1:10);
+assert_checkequal(r, 1);
+fre = eye(10, 10);
+r = correl(1:10, 1:10, fre);
+assert_checkequal(r, 1);
+fre = ones(10, 10);
+r = correl(1:10, 1:10, fre);
+assert_checkequal(r, 0);
+r = correl(1:10, -(1:10));
+assert_checkequal(r, -1);
+fre = eye(10, 10);
+r = correl(1:10, -(1:10), fre);
+assert_checkequal(r, -1);
+fre = ones(10, 10);
+r = correl(1:10, -(1:10), fre);
+assert_checkequal(r, 0);
diff --git a/scilab/modules/statistics/tests/nonreg_tests/bug_7848.tst b/scilab/modules/statistics/tests/nonreg_tests/bug_7848.tst
new file mode 100644 (file)
index 0000000..dc58415
--- /dev/null
@@ -0,0 +1,39 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Adeline CARNIS
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- CLI SHELL MODE -->
+
+// <-- Non-regression test for bug 7848 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=7848
+//
+// <-- Short Description -->
+//    The third argument of correl function is now optional.
+// =============================================================================
+
+r = correl(1:10, 1:10);
+assert_checkequal(r, 1);
+
+fre = eye(10, 10);
+r = correl(1:10, 1:10, fre);
+assert_checkequal(r, 1);
+
+fre = ones(10, 10);
+r = correl(1:10, 1:10, fre);
+assert_checkequal(r, 0);
+
+r = correl(1:10, -(1:10));
+assert_checkequal(r, -1);
+
+fre = eye(10, 10);
+r = correl(1:10, -(1:10), fre);
+assert_checkequal(r, -1);
+
+fre = ones(10, 10);
+r = correl(1:10, -(1:10), fre);
+assert_checkequal(r, 0);
diff --git a/scilab/modules/statistics/tests/unit_tests/correl.dia.ref b/scilab/modules/statistics/tests/unit_tests/correl.dia.ref
new file mode 100644 (file)
index 0000000..f5c3df3
--- /dev/null
@@ -0,0 +1,63 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Adeline CARNIS
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+// unit tests for correl function 
+// =============================================================================
+assert_checkfalse(execstr("correl()"   ,"errcatch") == 0);
+refMsg = msprintf(_("%s: Wrong number of input arguments: %d to %d expected.\n"),"correl",2,3);
+assert_checkerror("correl()", refMsg);
+assert_checkfalse(execstr("correl(1, [1 2])"   ,"errcatch") == 0);
+refMsg = msprintf(_("%s: Wrong type for input argument #%d: Vector expected.\n"),"correl",1);
+assert_checkerror("correl(1, [1 2])", refMsg);
+assert_checkfalse(execstr("correl(""e"", [1 2])"   ,"errcatch") == 0);
+refMsg = msprintf(_("%s: Wrong type for input argument #%d: Vector expected.\n"),"correl",1);
+assert_checkerror("correl(""e"", [1 2])", refMsg);
+assert_checkfalse(execstr("correl([1 2], 1)"   ,"errcatch") == 0);
+refMsg = msprintf(_("%s: Wrong type for input argument #%d: Vector expected.\n"),"correl",2);
+assert_checkerror("correl([1 2], 1)", refMsg);
+assert_checkfalse(execstr("correl([1 2], ""e"")"   ,"errcatch") == 0);
+refMsg = msprintf(_("%s: Wrong type for input argument #%d: Vector expected.\n"),"correl",2);
+assert_checkerror("correl([1 2], ""e"")", refMsg);
+r = correl([1 2 3], [8 9 1]);
+assert_checkalmostequal(r, -0.802955068, [], %eps);
+r = correl([1 2 3], [8 9 1], eye(3,3));
+assert_checkalmostequal(r, -0.802955068, [], %eps);
+r = correl([9 5 1 3 5 7], [8 4 2 6 0 8]);
+assert_checkalmostequal(r, 0.6062178, [], 1.e-8);
+r = correl([9 5 1 3 5 7], [8 4 2 6 0 8], eye(6,6));
+assert_checkalmostequal(r, 0.6062178, [], 1.e-8);
+r = correl([9 7 4 10 3 4 4 3 6], [5 4 6 6 5 3 7 5 10]);
+assert_checkalmostequal(r, 0.0880254, [], 1.e-7);
+r = correl([9 7 4 10 3 4 4 3 6]', [5 4 6 6 5 3 7 5 10]);
+assert_checkalmostequal(r, 0.0880254, [], 1.e-7);
+r = correl([9 7 4 10 3 4 4 3 6], [5 4 6 6 5 3 7 5 10]');
+assert_checkalmostequal(r, 0.0880254, [], 1.e-7);
+r = correl([9 7 4 10 3 4 4 3 6]', [5 4 6 6 5 3 7 5 10]');
+assert_checkalmostequal(r, 0.0880254, [], 1.e-7);
+r = correl([9 7 4 10 3 4 4 3 6], [5 4 6 6 5 3 7 5 10], eye(9,9));
+assert_checkalmostequal(r, 0.0880254, [], 1.e-7);
+assert_checkfalse(execstr("correl([1 4 9 7 2], [6 3 0])"   ,"errcatch") == 0);
+refMsg = msprintf(_("%s: Incompatible input arguments #%d and #%d: Same sizes expected"), "correl", 1, 2);
+assert_checkerror("correl([1 4 9 7 2], [6 3 0])", refMsg);
+r = correl([1 4 9 7 2], [6 3 0], eye(5,3));
+assert_checkalmostequal(r, -0.9897433, [], 1.e-8);
+r = correl([1 4 9 7 2], [6 3 0], [0.3 0.5 0.7;0.1 1 0.4;0.3 0.6 0.4;0.2 0.2 0.3;0.8 0.4 0.5]);
+assert_checkalmostequal(r, -0.0089969, [], 1.e-7);
+r = correl([1 4 9 7 2], [2 5 10 8 3])
+ r  =
+    1.  
+assert_checkequal(r, 1);
+r = correl([1 4 9 7 2], [-0 -3 -8 -6 -1])
+ r  =
+  - 1.  
+assert_checkequal(r, -1);
+x = [24.2; 22.7;30.5;28.6;25.5;32.0;28.6;26.5;25.3;26.0;24.4;24.8;20.6;25.1;21.4;23.7;23.9;25.2;27.4;28.3;28.8;26.6];
+y = [25;31;36;33;19;24;27;25;16;14;22;23;20;25;25;23;27;30;33;32;35;24];
+r = correl(x,y);
+assert_checkalmostequal(r,0.4189440, [], 1.e-7);
diff --git a/scilab/modules/statistics/tests/unit_tests/correl.tst b/scilab/modules/statistics/tests/unit_tests/correl.tst
new file mode 100644 (file)
index 0000000..92f3248
--- /dev/null
@@ -0,0 +1,80 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Adeline CARNIS
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- CLI SHELL MODE -->
+
+// unit tests for correl function 
+// =============================================================================
+
+assert_checkfalse(execstr("correl()"   ,"errcatch") == 0);
+refMsg = msprintf(_("%s: Wrong number of input arguments: %d to %d expected.\n"),"correl",2,3);
+assert_checkerror("correl()", refMsg);
+
+assert_checkfalse(execstr("correl(1, [1 2])"   ,"errcatch") == 0);
+refMsg = msprintf(_("%s: Wrong type for input argument #%d: Vector expected.\n"),"correl",1);
+assert_checkerror("correl(1, [1 2])", refMsg);
+
+assert_checkfalse(execstr("correl(""e"", [1 2])"   ,"errcatch") == 0);
+refMsg = msprintf(_("%s: Wrong type for input argument #%d: Vector expected.\n"),"correl",1);
+assert_checkerror("correl(""e"", [1 2])", refMsg);
+
+assert_checkfalse(execstr("correl([1 2], 1)"   ,"errcatch") == 0);
+refMsg = msprintf(_("%s: Wrong type for input argument #%d: Vector expected.\n"),"correl",2);
+assert_checkerror("correl([1 2], 1)", refMsg);
+
+assert_checkfalse(execstr("correl([1 2], ""e"")"   ,"errcatch") == 0);
+refMsg = msprintf(_("%s: Wrong type for input argument #%d: Vector expected.\n"),"correl",2);
+assert_checkerror("correl([1 2], ""e"")", refMsg);
+
+
+r = correl([1 2 3], [8 9 1]);
+assert_checkalmostequal(r, -0.802955068, [], %eps);
+
+r = correl([1 2 3], [8 9 1], eye(3,3));
+assert_checkalmostequal(r, -0.802955068, [], %eps);
+
+r = correl([9 5 1 3 5 7], [8 4 2 6 0 8]);
+assert_checkalmostequal(r, 0.6062178, [], 1.e-8);
+
+r = correl([9 5 1 3 5 7], [8 4 2 6 0 8], eye(6,6));
+assert_checkalmostequal(r, 0.6062178, [], 1.e-8);
+
+r = correl([9 7 4 10 3 4 4 3 6], [5 4 6 6 5 3 7 5 10]);
+assert_checkalmostequal(r, 0.0880254, [], 1.e-7);
+
+r = correl([9 7 4 10 3 4 4 3 6]', [5 4 6 6 5 3 7 5 10]);
+assert_checkalmostequal(r, 0.0880254, [], 1.e-7);
+
+r = correl([9 7 4 10 3 4 4 3 6], [5 4 6 6 5 3 7 5 10]');
+assert_checkalmostequal(r, 0.0880254, [], 1.e-7);
+
+r = correl([9 7 4 10 3 4 4 3 6]', [5 4 6 6 5 3 7 5 10]');
+assert_checkalmostequal(r, 0.0880254, [], 1.e-7);
+
+r = correl([9 7 4 10 3 4 4 3 6], [5 4 6 6 5 3 7 5 10], eye(9,9));
+assert_checkalmostequal(r, 0.0880254, [], 1.e-7);
+
+assert_checkfalse(execstr("correl([1 4 9 7 2], [6 3 0])"   ,"errcatch") == 0);
+refMsg = msprintf(_("%s: Incompatible input arguments #%d and #%d: Same sizes expected"), "correl", 1, 2);
+assert_checkerror("correl([1 4 9 7 2], [6 3 0])", refMsg);
+
+r = correl([1 4 9 7 2], [6 3 0], eye(5,3));
+assert_checkalmostequal(r, -0.9897433, [], 1.e-8);
+
+r = correl([1 4 9 7 2], [6 3 0], [0.3 0.5 0.7;0.1 1 0.4;0.3 0.6 0.4;0.2 0.2 0.3;0.8 0.4 0.5]);
+assert_checkalmostequal(r, -0.0089969, [], 1.e-7);
+
+r = correl([1 4 9 7 2], [2 5 10 8 3])
+assert_checkequal(r, 1);
+
+r = correl([1 4 9 7 2], [-0 -3 -8 -6 -1])
+assert_checkequal(r, -1);
+
+x = [24.2; 22.7;30.5;28.6;25.5;32.0;28.6;26.5;25.3;26.0;24.4;24.8;20.6;25.1;21.4;23.7;23.9;25.2;27.4;28.3;28.8;26.6];
+y = [25;31;36;33;19;24;27;25;16;14;22;23;20;25;25;23;27;30;33;32;35;24];
+r = correl(x,y);
+assert_checkalmostequal(r,0.4189440, [], 1.e-7);