added a basic elementary function for Matlab compatiblity 98/2898/4
Serge Steer [Wed, 12 Jan 2011 14:17:14 +0000 (15:17 +0100)]
Change-Id: Ice186c57358027615dda83e581327b775cccf77d

SEP/SEP_49_repmat.odt [new file with mode: 0644]
scilab/CHANGES_5.3.X
scilab/modules/elementary_functions/help/en_US/repmat.xml [new file with mode: 0644]
scilab/modules/elementary_functions/help/fr_FR/repmat.xml [new file with mode: 0644]
scilab/modules/elementary_functions/macros/repmat.sci [new file with mode: 0644]
scilab/modules/elementary_functions/tests/unit_tests/repmat.dia.ref [new file with mode: 0644]
scilab/modules/elementary_functions/tests/unit_tests/repmat.tst [new file with mode: 0644]

diff --git a/SEP/SEP_49_repmat.odt b/SEP/SEP_49_repmat.odt
new file mode 100644 (file)
index 0000000..3acc2ce
Binary files /dev/null and b/SEP/SEP_49_repmat.odt differ
index 1b6be73..18d4fa9 100644 (file)
@@ -30,6 +30,10 @@ Removed functions (previously declared as obsolete):
 * 'oldbesseli', 'oldbesselj', 'oldbesselk' and 'oldbessely' removed.
   Please use 'besseli', 'besselj', 'besselk' and 'bessely' instead.
 
+New functions
+=============
+
+* 'repmat' added a missing basic function.
 
 Demonstration:
 ==============
diff --git a/scilab/modules/elementary_functions/help/en_US/repmat.xml b/scilab/modules/elementary_functions/help/en_US/repmat.xml
new file mode 100644 (file)
index 0000000..93c8c42
--- /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) 2011 - INRIA - Serge Steer
+ * 
+ * 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-en.txt
+ *
+ -->
+<refentry version="5.0-subset Scilab" xml:id="repmat" xml:lang="en"
+          xmlns="http://docbook.org/ns/docbook"
+          xmlns:xlink="http://www.w3.org/1999/xlink"
+          xmlns:svg="http://www.w3.org/2000/svg"
+          xmlns:ns5="http://www.w3.org/1999/xhtml"
+          xmlns:mml="http://www.w3.org/1998/Math/MathML"
+          xmlns:db="http://docbook.org/ns/docbook">
+  <info>
+    <pubdate>$LastChangedDate: 2011-01-12  (mer, 12 jan 2011)
+    $</pubdate>
+  </info>
+
+  <refnamediv>
+    <refname>repmat</refname>
+
+    <refpurpose>Replicate and tile an array</refpurpose>
+  </refnamediv>
+
+  <refsynopsisdiv>
+    <title>Calling Sequence</title>
+
+    <synopsis>B = repmat(A,m,n,...)</synopsis>
+    <synopsis>B = repmat(A,siz)</synopsis>
+    <synopsis>B = repmat(A,m)</synopsis>
+  </refsynopsisdiv>
+
+  <refsection>
+    <title>Arguments</title>
+
+    <variablelist>
+      <varlistentry>
+        <term>A</term>
+
+        <listitem>
+          <para>input 2D array.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term>m, n, ...</term>
+        <listitem>
+          <para>integers, number of <literal>A</literal> blocks for
+          each dimension of <literal>B</literal>.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term>siz</term>
+
+        <listitem>
+          <para>vector of integer, each element gives the number of
+          <literal>A</literal> blocks for corresponding dimension of
+          <literal>B</literal>.</para>
+        </listitem>
+      </varlistentry>
+
+
+      <varlistentry>
+        <term>B</term> 
+
+        <listitem>
+          <para>resulting array form by tiling the <literal>A</literal> 2D array.</para>
+        </listitem>
+      </varlistentry>
+    </variablelist>
+  </refsection>
+
+  <refsection>
+    <title>Description</title>
+
+    <para><literal>repmat(A,m,n)</literal> or similarily
+    <literal>repmat(A,[m,n])</literal> returns a large matrix
+    consisting of an <literal>m</literal>-by- <literal>n</literal>
+    tiling of copies of <literal>A</literal>. The size of the result
+    is <literal>[size(A,1)*M, size(A,2)*N]</literal>.</para>
+
+    <para><literal>repmat(A,m)</literal> creates an
+    <literal>m</literal>-by- <literal>m</literal>tiling.</para>
+
+
+    <para><literal>repmat(A,[m n p ...])</literal> tiles the array A to produce a 
+    multidimensional array  composed of copies of  <literal>A</literal>. The size of the result is 
+    <literal>[size(A,1)*M, size(A,2)*N, size(A,3)*P, ...] </literal></para>.
+
+
+    <para>For now,only arrays of real, integer, boolean, character
+    string, polynomial and rational as well as sparse matrices are
+    supported. This function definition can be extended using
+    overloading mechanism.</para>
+  </refsection>
+
+  <refsection>
+    <title>Examples</title>
+
+    <programlisting role="example"><![CDATA[ 
+    repmat(1:3,2,2)
+    repmat(int8([1 0 1;0 1 0]),2,3,2)
+    repmat("Scilab",3,2)
+    t="Scilab";t(ones(3,2))
+    repmat([1/%s;2/(%s+1)],1,3)
+
+ ]]></programlisting>
+  </refsection>
+
+  <refsection>
+    <title>See Also</title>
+
+    <simplelist type="inline">
+      <member><link linkend="matrix">matrix</link></member>
+
+      <member><link linkend="extraction">extraction</link></member>
+
+      <member><link linkend="size">size</link></member>
+    </simplelist>
+  </refsection>
+
+  <refsection>
+    <title>Authors</title>
+
+    <para>Serge Steer, INRIA</para>
+  </refsection>
+</refentry>
diff --git a/scilab/modules/elementary_functions/help/fr_FR/repmat.xml b/scilab/modules/elementary_functions/help/fr_FR/repmat.xml
new file mode 100644 (file)
index 0000000..627547c
--- /dev/null
@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2011 - INRIA - Serge Steer
+ * 
+ * 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-en.txt
+ *
+ -->
+<refentry version="5.0-subset Scilab" xml:id="repmat" xml:lang="fr"
+          xmlns="http://docbook.org/ns/docbook"
+          xmlns:xlink="http://www.w3.org/1999/xlink"
+          xmlns:svg="http://www.w3.org/2000/svg"
+          xmlns:ns5="http://www.w3.org/1999/xhtml"
+          xmlns:mml="http://www.w3.org/1998/Math/MathML"
+          xmlns:db="http://docbook.org/ns/docbook">
+  <info>
+    <pubdate>$LastChangedDate: 2011-01-12  (mer, 12 jan 2011)
+    $</pubdate>
+  </info>
+
+  <refnamediv>
+    <refname>repmat</refname>
+
+    <refpurpose>Définit un grand tableau par pavage avec un tableau 2D.</refpurpose>
+  </refnamediv>
+
+  <refsynopsisdiv>
+    <title>Sequence d'appel</title>
+
+    <synopsis>B = repmat(A,m,n,...)</synopsis>
+    <synopsis>B = repmat(A,siz)</synopsis>
+    <synopsis>B = repmat(A,m)</synopsis>
+  </refsynopsisdiv>
+
+  <refsection>
+    <title>Arguments</title>
+
+    <variablelist>
+      <varlistentry>
+        <term>A</term>
+
+        <listitem>
+          <para>tableau 2D.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term>m, n, ...</term>
+        <listitem>
+          <para>entiers, nombres de copie de <literal>A</literal> pour
+          chaque dimension de <literal>B</literal>.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term>siz</term>
+
+        <listitem>
+          <para>vecteur d'entiers, Chaque élément donne le nombre de
+          copie de <literal>A</literal> pour la dimension
+          correspondante de <literal>B</literal>.</para>
+        </listitem>
+      </varlistentry>
+
+
+      <varlistentry>
+        <term>B</term> 
+
+        <listitem>
+          <para>Le tableau résultant du pavage.</para>
+        </listitem>
+      </varlistentry>
+    </variablelist>
+  </refsection>
+
+  <refsection>
+    <title>Description</title>
+
+    <para><literal>repmat(A,m,n)</literal> or de façon équivalente,
+    <literal>repmat(A,[m,n])</literal> retourne un grand tableau formé
+    d'un pavage <literal>m</literal>-par- <literal>n</literal> avec
+    des copies de <literal>A</literal>.  La taille du résultat est
+    <literal>[size(A,1)*M, size(A,2)*N]</literal>.</para>
+
+    <para><literal>repmat(A,m)</literal> crée un pavage 
+    <literal>m</literal>-by- <literal>m</literal>.</para>
+
+
+    <para><literal>repmat(A,[m n p ...])</literal> pave un tableau
+    mutidimensionnel <literal>m</literal>-par-
+    <literal>n</literal>-par- <literal>p</literal> ... avec des copies
+    de <literal>A</literal>. La taille du résultat est
+    <literal>[size(A,1)*M, size(A,2)*N, size(A,3)*P,
+    ...]</literal</para>>.
+
+
+    <para>Cette fonction supporte les tableaux de réels, d'entiers, de
+    booléens, de chaînes de caractères, de polynômes, et de fractions
+    rationnelles ainsi que les matrices creuses. Cette fonction peut
+    être étendue en utilisant le méchanisme de surcharge.</para>
+  </refsection>
+
+  <refsection>
+    <title>Exemples</title>
+
+    <programlisting role="example"><![CDATA[ 
+    repmat(1:3,2,2)
+    repmat(int8([1 0 1;0 1 0]),2,3,2)
+    repmat("Scilab",3,2)
+    t="Scilab";t(ones(3,2))
+    repmat([1/%s;2/(%s+1)],1,3)
+
+ ]]></programlisting>
+  </refsection>
+
+  <refsection>
+    <title>Voir Aussi</title>
+
+    <simplelist type="inline">
+      <member><link linkend="matrix">matrix</link></member>
+
+      <member><link linkend="extraction">extraction</link></member>
+
+      <member><link linkend="size">size</link></member>
+    </simplelist>
+  </refsection>
+
+  <refsection>
+    <title>Auteurs</title>
+
+    <para>Serge Steer, INRIA</para>
+  </refsection>
+</refentry>
diff --git a/scilab/modules/elementary_functions/macros/repmat.sci b/scilab/modules/elementary_functions/macros/repmat.sci
new file mode 100644 (file)
index 0000000..174ee0a
--- /dev/null
@@ -0,0 +1,70 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) - 2011 -  INRIA, Serge Steer
+// 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-en.txt
+function B = repmat(A,varargin)
+  if type(A)>10 then
+    if typeof(A)=="rational" then
+      B=rlist(repmat(A.num,varargin(:)),repmat(A.den,varargin(:)),A.dt)
+      return
+    else
+      execstr('B=%'+typeof(A)+"_repmat(A,varargin(:))")
+    end
+  end
+  narg=size(varargin)
+  //ajouter test sur les type des elements de varargin
+  if narg<1 then
+     error(msprintf(_("%s: Wrong number of input arguments: at least %d expected.\n"),"repmat",2))
+  end
+  if narg==1 then 
+    if size(varargin(1),'*')==1 then
+      siz=list(varargin(1),varargin(1))
+    else //convert array into list
+      tmp=varargin(1)
+      siz=list();
+      for i=1:size(tmp,'*'),siz(i)=tmp(i); end
+    end
+  else
+    siz=list();
+    for i=1:narg
+      if size(varargin(i),'*')<>1 then
+        error(msprintf(_("%s : Wrong size for input argument #%d: A scalar expected.\n"),"repmat",i))
+      else
+        siz(i)=varargin(i)
+      end
+    end
+  end
+  
+  nd=size(siz)
+  if or(type(A)==[5 6]) then //sparse matrices
+    if nd>2 then
+      error(msprintf(_("%s : Wrong number of output matrix dimensions required: %d expected for sparse matrices"),"repmat",2))
+    end
+  end
+  for i=size(siz):-1:3
+    if siz(i)>1 then break,end
+    nd=nd-1
+  end
+  sizA=size(A)
+  if and(sizA==1) then //scalar case
+    if nd<=2 then
+      B=A(ones(siz(1:nd)))
+    else
+      s=1;for k=1:nd;s=s*siz(i),end
+      B=matrix(A(ones(s,1)),siz(1:nd))
+    end
+  else
+    sizA(3:nd)=1;
+    I=list()
+    for i=1:nd
+      ind=matrix(1:sizA(i),-1,1)
+      ind=ind(:,ones(1,siz(i)))
+      I(i)=ind
+    end
+    B=A(I(:))
+  end
+endfunction
diff --git a/scilab/modules/elementary_functions/tests/unit_tests/repmat.dia.ref b/scilab/modules/elementary_functions/tests/unit_tests/repmat.dia.ref
new file mode 100644 (file)
index 0000000..6d8ce7b
--- /dev/null
@@ -0,0 +1,20 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2011 - INRIA - Serge Steer
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- JVM NOT MANDATORY -->
+if or(repmat(1:3,2,2)<>[1,2,3,1,2,3;1,2,3,1,2,3]) then bugmes();quit;end
+if or(repmat(1+2*%i,2)<>[ 1+%i*2, 1+%i*2; 1+%i*2, 1+%i*2]) then bugmes();quit;end
+a=int8([1 0 1;0 1 0]);
+if or(repmat(a,2,3,2)<>matrix(int32([1;0;1;0;0;1;0;1;1;0;1;1;1;0;1;0;0;1;
+                    0;1;1;0;1;0;1;0;1;0;0;1;0;1;1;0;1;0;1;0;1;0;0;1;0;1; 
+                    1;0;1;1;1;0;1;0;0;1;0;1;1;0;1;0;1;0;1;0;0;1;0;1;1;0; 
+                    1;0]),4,9,2)) then bugmes();quit;end 
+if or(repmat("Scilab",3,2)<>["Scilab","Scilab";"Scilab","Scilab";
+                    "Scilab","Scilab"]) then bugmes();quit;end
+H=repmat([1/%s;2/(%s+1)],1,3);
+if or(H.num<>[1,1,1;2,2,2]) then bugmes();quit;end
+if or(H.den<>[%s,%s,%s;1+%s,1+%s,1+%s]) then bugmes();quit;end
+if repmat([],2,2)<>[] then bugmes();quit;end
diff --git a/scilab/modules/elementary_functions/tests/unit_tests/repmat.tst b/scilab/modules/elementary_functions/tests/unit_tests/repmat.tst
new file mode 100644 (file)
index 0000000..b2b70dc
--- /dev/null
@@ -0,0 +1,28 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2011 - INRIA - Serge Steer
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- JVM NOT MANDATORY -->
+
+if or(repmat(1:3,2,2)<>[1,2,3,1,2,3;1,2,3,1,2,3]) then pause,end
+if or(repmat(1+2*%i,2)<>[ 1+%i*2, 1+%i*2; 1+%i*2, 1+%i*2]) then pause,end
+
+
+a=int8([1 0 1;0 1 0]);
+if or(repmat(a,2,3,2)<>matrix(int32([1;0;1;0;0;1;0;1;1;0;1;1;1;0;1;0;0;1;
+                    0;1;1;0;1;0;1;0;1;0;0;1;0;1;1;0;1;0;1;0;1;0;0;1;0;1; 
+                    1;0;1;1;1;0;1;0;0;1;0;1;1;0;1;0;1;0;1;0;0;1;0;1;1;0; 
+                    1;0]),4,9,2)) then pause,end 
+
+  
+if or(repmat("Scilab",3,2)<>["Scilab","Scilab";"Scilab","Scilab";
+                    "Scilab","Scilab"]) then pause,end
+
+H=repmat([1/%s;2/(%s+1)],1,3);
+if or(H.num<>[1,1,1;2,2,2]) then pause,end
+if or(H.den<>[%s,%s,%s;1+%s,1+%s,1+%s]) then pause,end
+if repmat([],2,2)<>[] then pause,end
+