Bug #13339: Kronecker product on hypermatrices 46/14446/18
Samuel Gougeon [Tue, 22 Apr 2014 16:33:27 +0000 (18:33 +0200)]
Change-Id: I06f7759aa284b1e5d5d23e858e2eee900c9c30ce

12 files changed:
scilab/CHANGES_5.5.X
scilab/modules/elementary_functions/help/en_US/matrixoperations/kron.xml
scilab/modules/elementary_functions/help/fr_FR/matrixoperations/kron.xml
scilab/modules/elementary_functions/help/ja_JP/matrixoperations/kron.xml
scilab/modules/elementary_functions/help/pt_BR/matrixoperations/kron.xml
scilab/modules/elementary_functions/help/ru_RU/matrixoperations/kron.xml
scilab/modules/elementary_functions/tests/nonreg_tests/bug_13339.dia.ref [new file with mode: 0644]
scilab/modules/elementary_functions/tests/nonreg_tests/bug_13339.tst [new file with mode: 0644]
scilab/modules/overloading/macros/%hmS_k_hmS_generic.sci [new file with mode: 0644]
scilab/modules/overloading/macros/%hm_k_hm.sci
scilab/modules/overloading/macros/%hm_k_s.sci
scilab/modules/overloading/macros/%s_k_hm.sci

index f8a2335..716c23c 100644 (file)
@@ -103,6 +103,8 @@ Scilab Bug Fixes
 
 * Bug #13336 fixed - In SciNotes it was not possible to complete brackets only at eol.
 
+* Bug #13339 fixed - Kronecker tensor product now works on hypermatrices.
+
 * Bug #13343 fixed - In console popup menu, 'help about a selected text' moved
                      from bottom to top for consistency with Scinotes.
 
index 0d577c6..9f4b614 100644 (file)
@@ -2,11 +2,12 @@
 <!--
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2008 - INRIA
- * 
+ * Copyright (C) 2014 - Samuel Gougeon : extension to hypermatrices
+ *
  * 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
  *
  -->
         </synopsis>
     </refsynopsisdiv>
     <refsection>
+        <title>Arguments</title>
+        <variablelist>
+            <varlistentry>
+                <term>A</term>
+                <listitem>
+                    <para>a matrix or hypermatrix.</para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>B</term>
+                <listitem>
+                    <para>a matrix or hypermatrix.</para>
+                </listitem>
+            </varlistentry>
+        </variablelist>
+    </refsection>
+    <refsection>
         <title>Description</title>
         <para>
             <literal>kron(A,B)</literal> or <literal>A.*.B</literal> returns the
-            Kronecker tensor product of two matrices <literal>A</literal> and
+            Kronecker tensor product of two matrices or hypermatrices<literal>A</literal> and
             <literal>B</literal>. The resulting matrix has the following block
             form:
         </para>
         </informalequation>
         <para>
             If <literal>A</literal> is a <literal>m x n</literal> matrix and
-            <literal>B</literal> a <literal>p x q</literal> matrix then
-            <literal>A.*.B</literal> is a <literal>(m*p) x (n*q)</literal>
-            matrix.
+            <literal>B</literal> a <literal>p x q x r</literal> hypermatrix then
+            <literal>A.*.B</literal> is a <literal>(m*p) x (n*q) x (1*r)</literal>
+            hypermatrix.
         </para>
         <para>
             <literal>A</literal> and <literal>B</literal> can be sparse
-            matrices.
+            matrices, although the Kronecker product is not defined between a sparse matrix and
+            a hypermatrix.
         </para>
     </refsection>
     <refsection>
         <title>Examples</title>
-        <programlisting role="example"><![CDATA[ 
-A=[1,2;3,4];
+        <programlisting role="example"><![CDATA[
+A = [1,2;3,4];
 kron(A,A)
 A.*.A
 sparse(A).*.sparse(A)
-A(1,1)=%i;
+A(1,1) = %i;
 kron(A,A)
+
+// With hypermatrices
+// ------------------
+b = hypermat([4 3 2], 1:24);
+
+// row .*. hypermat
+a = 1:2, b
+a.*.b
+
+// hypermat .*. row
+b,a
+b .*. a
+
+// column .*. hypermat
+a = [1;2], b
+a.*.b
+
+// matrix .*. hypermat
+a = [-1 -2; 2 1], b
+a.*.b
+
+// hypermat .*. hypermat
+a = hypermat([1 2 2],[-1,-2, 1 2]), b
+a.*.b
  ]]></programlisting>
     </refsection>
+    <refsection>
+        <title>History</title>
+        <revhistory>
+            <revision>
+                <revnumber>5.5.1</revnumber>
+                <revdescription>
+                    <para>Extension to hypermatrices</para>
+                </revdescription>
+            </revision>
+        </revhistory>
+    </refsection>
+
 </refentry>
index 2995f64..ab9f9ef 100644 (file)
@@ -1,4 +1,16 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C)
+ * Copyright (C) 2014 - Samuel Gougeon : extension to hypermatrices
+ *
+ * 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:ns5="http://www.w3.org/1999/xhtml" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org" xml:id="kron" xml:lang="fr">
     <refnamediv>
         <refname>kron</refname>
     </refnamediv>
     <refsynopsisdiv>
         <title>Séquence d'appel</title>
-        <synopsis>kron(x,y)
-            x.*.y
+        <synopsis>kron(A, B)
+            A.*.B
         </synopsis>
     </refsynopsisdiv>
     <refsection>
+        <title>Paramètres</title>
+        <variablelist>
+            <varlistentry>
+                <term>A</term>
+                <listitem>
+                    <para>matrice ou hypermatrice.</para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>B</term>
+                <listitem>
+                    <para>matrice ou hypermatrice</para>
+                </listitem>
+            </varlistentry>
+        </variablelist>
+    </refsection>
+    <refsection>
         <title>Description</title>
         <para>
-            Produit tensoriel de Kronecker de deux matrices <literal>x</literal>
-            et <literal>y</literal>. Identique à <literal>x.*.y</literal>.
-            <literal>x</literal> et <literal>y</literal> peuvent être des matrices
-            creuses.
+            <literal>kron(A,B)</literal> ou <literal>A.*.B</literal> calcule et fournit le produit
+            tensoriel de Kronecker de deux matrices ou hypermatrices <literal>A</literal>
+            et <literal>B</literal>. La matrice résultante a la forme suivante :
+        </para>
+        <informalequation>
+            <mediaobject>
+                <imageobject>
+                    <imagedata fileref="../../mml/kron_equation_1.mml"/>
+                </imageobject>
+            </mediaobject>
+        </informalequation>
+        <para>
+            Si <literal>A</literal> est une matrice <literal>m x n</literal> et
+            <literal>B</literal> une hypermatrice <literal>p x q x r</literal>, alors
+            <literal>A.*.B</literal> est une hypermatrice <literal>(m*p) x (n*q) x (1*r)</literal>.
+        </para>
+        <para>
+            <literal>A</literal> et <literal>B</literal> peuvent être des matrices creuses. Cependant le produit de Kronecker n'est pas défini entre une matrice creuse et une hypermatrice.
         </para>
     </refsection>
     <refsection>
         <title>Exemples</title>
-        <programlisting role="example"><![CDATA[ 
-A=[1,2;3,4];
+        <programlisting role="example"><![CDATA[
+A = [1,2;3,4];
 kron(A,A)
 A.*.A
 sparse(A).*.sparse(A)
-A(1,1)=%i;
+A(1,1) = %i;
 kron(A,A)
+
+// avec des hypermatrices
+// ----------------------
+b = hypermat([4 3 2], 1:24);
+
+// row .*. hypermat
+clc
+a = 1:2, b
+a.*.b
+
+// hypermat .*. row
+clc
+b,a
+b .*. a
+
+// column .*. hypermat
+clc
+a = [1;2], b
+a.*.b
+
+// matrix .*. hypermat
+clc
+a = [-1 -2; 2 1], b
+a.*.b
+
+// hypermat .*. hypermat
+clc
+a = hypermat([1 2 2],[-1,-2, 1 2]), b
+a.*.b
  ]]></programlisting>
     </refsection>
+    <refsection>
+        <title>Historique</title>
+        <revhistory>
+            <revision>
+                <revnumber>5.5.1</revnumber>
+                <revdescription>
+                    <para>Extension aux hypermatrices</para>
+                </revdescription>
+            </revision>
+        </revhistory>
+    </refsection>
 </refentry>
index 25af00f..83aeab7 100644 (file)
@@ -2,11 +2,12 @@
 <!--
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2008 - INRIA
- * 
+ * Copyright (C) 2014 - Samuel Gougeon : extension to hypermatrices
+ *
  * 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
  *
  -->
     </refsection>
     <refsection>
         <title>例</title>
-        <programlisting role="example"><![CDATA[ 
-A=[1,2;3,4];
+        <programlisting role="example"><![CDATA[
+A = [1,2;3,4];
 kron(A,A)
 A.*.A
 sparse(A).*.sparse(A)
-A(1,1)=%i;
+A(1,1) = %i;
 kron(A,A)
+
+// With hypermatrices
+// ------------------
+b = hypermat([4 3 2], 1:24);
+
+// row .*. hypermat
+clc
+a = 1:2, b
+a.*.b
+
+// hypermat .*. row
+clc
+b,a
+b .*. a
+
+// column .*. hypermat
+clc
+a = [1;2], b
+a.*.b
+
+// matrix .*. hypermat
+clc
+a = [-1 -2; 2 1], b
+a.*.b
+
+// hypermat .*. hypermat
+clc
+a = hypermat([1 2 2],[-1,-2, 1 2]), b
+a.*.b
  ]]></programlisting>
     </refsection>
+    <refsection>
+        <title>履歴</title>
+        <revhistory>
+            <revision>
+                <revnumber>5.5.1</revnumber>
+                <revdescription>
+                    <para>Extension to hypermatrices</para>
+                </revdescription>
+            </revision>
+        </revhistory>
+    </refsection>
+
 </refentry>
index 208df91..0742f0a 100644 (file)
-<?xml version="1.0" encoding="ISO-8859-1"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <!--
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2008 - INRIA
- * 
+ * Copyright (C) 2014 - Samuel Gougeon : extension to hypermatrices
+ *
  * 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:ns3="http://www.w3.org/1999/xhtml" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org" xml:id="kron" xml:lang="en">
+<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:ns3="http://www.w3.org/1999/xhtml" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org" xml:id="kron" xml:lang="pt">
     <refnamediv>
         <refname>kron</refname>
         <refpurpose>produto de Kronecker (.*.) </refpurpose>
     </refnamediv>
     <refsynopsisdiv>
-        <title>Seqüência de Chamamento</title>
+        <title>Seqüência de Chamamento</title>
         <synopsis>kron(A,B)
             A.*.B
         </synopsis>
     </refsynopsisdiv>
     <refsection>
-        <title>Descrição</title>
+        <title>Descrição</title>
         <para>
             <literal>kron(A,B)</literal> ou <literal>A.*.B</literal> retorna o
-            produto tensorial de Kronecker entre duas matrizes <literal>A</literal> e
+            produto tensorial de Kronecker entre duas matrizes ou hypermatrizes <literal>A</literal> e
             <literal>B</literal>. A matriz resultante tem a seguinte forma de blocos:
         </para>
-        <programlisting role=""><![CDATA[ 
-              | A(1,1) B ..... A(1,n) B |
-              |   .              .      |
-    A .*. B = |   .              .      |   
-              |   .              .      |
-              | A(m,1) B ..... A(m,n) B |
- ]]></programlisting>
+        <informalequation>
+            <mediaobject>
+                <imageobject>
+                    <imagedata fileref="../../mml/kron_equation_1.mml"/>
+                </imageobject>
+            </mediaobject>
+        </informalequation>
         <para>
-            Se <literal>A</literal> é uma matriz <literal>m x n</literal> e
-            <literal>B</literal> é uma matriz <literal>p x q</literal> , então
-            <literal>A.*.B</literal> é uma matriz <literal>(m*p) x
-                (n*q)
+            Se <literal>A</literal> é uma matriz <literal>m x n</literal> e
+            <literal>B</literal> é uma hypermatriz <literal>p x q x r</literal> , então
+            <literal>A.*.B</literal> é uma hypermatriz <literal>(m*p) x (n*q) x (1*r)
             </literal>
             .
         </para>
         <para>
-            <literal>A</literal> e <literal>B</literal> podem ser matrizes
-            esparsas.
+            <literal>A</literal> e <literal>B</literal> podem ser matrizes esparsas, mas o produto de Kronecker não é definida entre uma matriz e uma hipermatriz.
         </para>
     </refsection>
     <refsection>
         <title>Exemplos</title>
-        <programlisting role="example"><![CDATA[ 
-A=[1,2;3,4];
+        <programlisting role="example"><![CDATA[
+A = [1,2;3,4];
 kron(A,A)
 A.*.A
 sparse(A).*.sparse(A)
-A(1,1)=%i;
+A(1,1) = %i;
 kron(A,A)
+
+// com hypermatrizes
+// -----------------
+b = hypermat([4 3 2], 1:24);
+
+// row .*. hypermat
+clc
+a = 1:2, b
+a.*.b
+
+// hypermat .*. row
+clc
+b,a
+b .*. a
+
+// column .*. hypermat
+clc
+a = [1;2], b
+a.*.b
+
+// matrix .*. hypermat
+clc
+a = [-1 -2; 2 1], b
+a.*.b
+
+// hypermat .*. hypermat
+clc
+a = hypermat([1 2 2],[-1,-2, 1 2]), b
+a.*.b
  ]]></programlisting>
     </refsection>
+    <refsection>
+        <title>Histórico</title>
+        <revhistory>
+            <revision>
+                <revnumber>5.5.1</revnumber>
+                <revdescription>
+                    <para>Extensão ao hypermatrizes</para>
+                </revdescription>
+            </revision>
+        </revhistory>
+    </refsection>
 </refentry>
index 5157936..92e9c2d 100644 (file)
@@ -2,11 +2,12 @@
 <!--
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2008 - INRIA
- * 
+ * Copyright (C) 2014 - Samuel Gougeon : extension to hypermatrices
+ *
  * 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
  *
  -->
@@ -25,8 +26,8 @@
     <refsection>
         <title>Описание</title>
         <para>
-            <literal>kron(A,B)</literal> или <literal>A.*.B</literal> возвращает результат 
-            Кронекеровского тензорного произведения двух матриц <literal>A</literal> и 
+            <literal>kron(A,B)</literal> или <literal>A.*.B</literal> возвращает результат
+            Кронекеровского тензорного произведения двух матриц или гиперматрицам <literal>A</literal> и
             <literal>B</literal>. Матрица результата имеет следующую блочную форму:
         </para>
         <informalequation>
@@ -37,8 +38,8 @@
             </mediaobject>
         </informalequation>
         <para>
-            Если матрица <literal>A</literal> имеет размер <literal>m x n</literal>, а матрица 
-            <literal>B</literal> имеет размер <literal>p x q</literal>, то результат 
+            Если матрица <literal>A</literal> имеет размер <literal>m x n</literal>, а матрица
+            <literal>B</literal> имеет размер <literal>p x q</literal>, то результат
             <literal>A.*.B</literal> является матрицей размером <literal>(m*p) x (n*q)</literal>.
         </para>
         <para>
     </refsection>
     <refsection>
         <title>Примеры</title>
-        <programlisting role="example"><![CDATA[ 
-A=[1,2;3,4];
+        <programlisting role="example"><![CDATA[
+A = [1,2;3,4];
 kron(A,A)
 A.*.A
 sparse(A).*.sparse(A)
-A(1,1)=%i;
+A(1,1) = %i;
 kron(A,A)
+
+// with hypermatrices
+// ------------------
+b = hypermat([4 3 2], 1:24);
+
+// row .*. hypermat
+clc
+a = 1:2, b
+a.*.b
+
+// hypermat .*. row
+clc
+b,a
+b .*. a
+
+// column .*. hypermat
+clc
+a = [1;2], b
+a.*.b
+
+// matrix .*. hypermat
+clc
+a = [-1 -2; 2 1], b
+a.*.b
+
+// hypermat .*. hypermat
+clc
+a = hypermat([1 2 2],[-1,-2, 1 2]), b
+a.*.b
  ]]></programlisting>
     </refsection>
+    <refsection>
+        <title>История</title>
+        <revhistory>
+            <revision>
+                <revnumber>5.5.1</revnumber>
+                <revdescription>
+                    <para>Распространение с целью гиперматрицам</para>
+                </revdescription>
+            </revision>
+        </revhistory>
+    </refsection>
 </refentry>
diff --git a/scilab/modules/elementary_functions/tests/nonreg_tests/bug_13339.dia.ref b/scilab/modules/elementary_functions/tests/nonreg_tests/bug_13339.dia.ref
new file mode 100644 (file)
index 0000000..e2d096b
--- /dev/null
@@ -0,0 +1,48 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2014 - Scilab Enterprises - Pierre-Aime Agnel
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- Non-regression test for bug 13339 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=13339
+//
+// <-- Short Description -->
+// Kronecker product does not work on hypermatrices
+//
+// <-- CLI SHELL MODE -->
+//==============================================================================
+// Nominal behaviour on Kronecker Product on hypermatrix
+//==============================================================================
+A = ones(2, 3, 3);
+A(2, 2, 2) = 2;
+B = hypermat([2, 2, 2], 1:8);
+// A.*.B must be the hypermatrix B pasted on each element of A multiplied by the
+// value of the element of A
+res = A .*. B;
+// res must be of size 4, 6, 6
+assert_checkalmostequal([4, 6, 6], size(res));
+// res(1:2, 1:2, 1:2) must be B
+assert_checkalmostequal(B, res(1:2, 1:2, 1:2));
+// res(3:4, 3:4, 3:4) must be 2*B as it corresponds to exactly A(2, 2, 2) .* B
+assert_checkalmostequal(2 .* B, res(3:4, 3:4, 3:4));
+//==============================================================================
+// Nominal behaviour on Kronecker Product on matrix and hypermatrix
+//==============================================================================
+C = [1 2; 3 4; 5 6];
+res = A .*. C;
+// Size of result must be [4 6 3]
+assert_checkalmostequal([6, 6, 3], size(res));
+// Values of C must be pasted on A
+assert_checkalmostequal(2 .* C, res(4:6, 3:4, 2));
+res = C .*. A;
+assert_checkalmostequal([6, 6, 3], size(res));
+assert_checkalmostequal(3 .* A, res(3:4, 1:3, 1:3));
+D = [1 1; 0 0];
+res_mat = C .*. D;
+D = hypermat([2, 2, 1], [1 0 1 0]);
+C = hypermat([3, 2, 1], [1 3 5 2 4 6]);
+res = C .*. D;
+assert_checkalmostequal(res_mat, res(:,:,1));
diff --git a/scilab/modules/elementary_functions/tests/nonreg_tests/bug_13339.tst b/scilab/modules/elementary_functions/tests/nonreg_tests/bug_13339.tst
new file mode 100644 (file)
index 0000000..166f95f
--- /dev/null
@@ -0,0 +1,67 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2014 - Scilab Enterprises - Pierre-Aime Agnel
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- Non-regression test for bug 13339 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=13339
+//
+// <-- Short Description -->
+// Kronecker product does not work on hypermatrices
+//
+// <-- CLI SHELL MODE -->
+
+
+//==============================================================================
+// Nominal behaviour on Kronecker Product on hypermatrix
+//==============================================================================
+
+A = ones(2, 3, 3);
+A(2, 2, 2) = 2;
+
+B = hypermat([2, 2, 2], 1:8);
+
+// A.*.B must be the hypermatrix B pasted on each element of A multiplied by the
+// value of the element of A
+res = A .*. B;
+
+// res must be of size 4, 6, 6
+assert_checkalmostequal([4, 6, 6], size(res));
+
+// res(1:2, 1:2, 1:2) must be B
+assert_checkalmostequal(B, res(1:2, 1:2, 1:2));
+
+// res(3:4, 3:4, 3:4) must be 2*B as it corresponds to exactly A(2, 2, 2) .* B
+assert_checkalmostequal(2 .* B, res(3:4, 3:4, 3:4));
+
+
+//==============================================================================
+// Nominal behaviour on Kronecker Product on matrix and hypermatrix
+//==============================================================================
+C = [1 2; 3 4; 5 6];
+res = A .*. C;
+
+// Size of result must be [4 6 3]
+assert_checkalmostequal([6, 6, 3], size(res));
+
+// Values of C must be pasted on A
+assert_checkalmostequal(2 .* C, res(4:6, 3:4, 2));
+
+res = C .*. A;
+assert_checkalmostequal([6, 6, 3], size(res));
+assert_checkalmostequal(3 .* A, res(3:4, 1:3, 1:3));
+
+D = [1 1; 0 0];
+res_mat = C .*. D;
+
+D = hypermat([2, 2, 1], [1 0 1 0]);
+C = hypermat([3, 2, 1], [1 3 5 2 4 6]);
+
+res = C .*. D;
+
+assert_checkalmostequal(res_mat, res(:,:,1));
+
diff --git a/scilab/modules/overloading/macros/%hmS_k_hmS_generic.sci b/scilab/modules/overloading/macros/%hmS_k_hmS_generic.sci
new file mode 100644 (file)
index 0000000..6ade511
--- /dev/null
@@ -0,0 +1,36 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2014 - Samuel GOUGEON
+//
+// 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 r = %hmS_k_hmS_generic(a, b)
+    
+    // Code used by %s_k_hm(), %hm_k_s() and %hm_k_hm()
+    // Fully rewritten and factorized after bug http://bugzilla.scilab.org/13339
+
+    sa = size(a)
+    sb = size(b)
+    sa = [sa ones(1,ndims(b)-ndims(a))]
+    sb = [sb ones(1,ndims(a)-ndims(b))]
+    La = length(a)
+    Lb = length(b)
+    a = a(:)
+    b = b(:)
+    ia = (1:La).' .*.ones(b);
+    ib = ones(a) .*. (1:Lb).';
+    ir = (ia-1).*Lb + ib;
+    pa = ind2sub(sa, ia)
+    pb = ind2sub(sb, ib)
+    clear ia ib
+    pr = (pa-1).*repmat(sb, La*Lb, 1) + pb
+    clear pa pb
+    nir = sub2ind(sa.*sb, pr)
+    [v,k] = gsort(nir,"g","i")
+    clear pr nir v
+    r = a.*.b
+    r = matrix(r(ir(k)), sa.*sb)
+endfunction
index a4f212e..fd57061 100644 (file)
@@ -1,5 +1,5 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) INRIA - Vincent Couvert
+// Copyright (C) 2014 - Samuel GOUGEON
 //
 // This file must be used under the terms of the CeCILL.
 // This source file is licensed as described in the file COPYING, which
@@ -7,15 +7,6 @@
 // are also available at
 // http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
 
-function M=%hm_k_hm(M1,M2)
-    hm1size = double(M1.dims);
-    hm2size = double(M2.dims);
-    hm1size = [hm1size ones(1,length(hm2size)-length(hm1size))];
-    hm2size = [hm2size ones(1,length(hm1size)-length(hm2size))];
-    subs=list()
-    for k=length(hm2size):-1:1
-        ind = (1:hm2size(k))';
-        subs(k) = ind(:,ones(1,hm1size(k)));
-    end
-    M = M2(subs(:));
+function r = %hm_k_hm(a, b)
+    r = %hmS_k_hmS_generic(a, b)
 endfunction
index 0e91445..d3289be 100644 (file)
@@ -1,5 +1,5 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) INRIA - Vincent Couvert
+// Copyright (C) 2014 - Samuel GOUGEON
 //
 // This file must be used under the terms of the CeCILL.
 // This source file is licensed as described in the file COPYING, which
@@ -7,16 +7,6 @@
 // are also available at
 // http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
 
-function M=%hm_k_s(M1,M2)
-    hmsize = double(M1.dims);
-    ssize = size(M2);
-    ssize = [ssize ones(1,length(hmsize)-length(ssize))];
-    hmsize = [hmsize ones(1,length(ssize)-length(hmsize))];
-    subs=list()
-    for k=length(ssize):-1:1
-        ind = (1:ssize(k))';
-        subs(k) = ind(:,ones(1,hmsize(k)));
-    end
-    M = M2(subs(:));
+function r = %hm_k_s(a, b)
+    r = %hmS_k_hmS_generic(a, b)
 endfunction
-
index 7b65968..16c02fb 100644 (file)
@@ -1,5 +1,5 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) INRIA - Vincent Couvert
+// Copyright (C) 2014 - Samuel GOUGEON
 //
 // This file must be used under the terms of the CeCILL.
 // This source file is licensed as described in the file COPYING, which
@@ -7,16 +7,6 @@
 // are also available at
 // http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
 
-function M=%s_k_hm(M1,M2)
-    hmsize = double(M2.dims);
-    ssize = size(M1);
-    ssize = [ssize ones(1,length(hmsize)-length(ssize))];
-    hmsize = [hmsize ones(1,length(ssize)-length(hmsize))];
-    subs=list()
-    for k=length(hmsize):-1:1
-        ind = (1:hmsize(k))';
-        subs(k) = ind(:,ones(1,ssize(k)));
-    end
-    M = M2(subs(:));
+function r = %s_k_hm(a, b)
+    r = %hmS_k_hmS_generic(a, b)
 endfunction
-