* Bug 16608 fixed: union() extended to boolean and to sparse matrices 37/21637/4
Samuel GOUGEON [Mon, 7 Dec 2020 21:42:13 +0000 (22:42 +0100)]
  http://bugzilla.scilab.org/16608
  union page updated (en_US PDF): http://bugzilla.scilab.org/attachment.cgi?id=5194

Change-Id: Id977654abc74264513c987253bb0e9bb1164be87

scilab/CHANGES.md
scilab/modules/elementary_functions/help/en_US/setoperations/union.xml
scilab/modules/elementary_functions/help/fr_FR/setoperations/union.xml
scilab/modules/elementary_functions/help/ja_JP/setoperations/union.xml
scilab/modules/elementary_functions/help/pt_BR/setoperations/union.xml
scilab/modules/elementary_functions/help/ru_RU/setoperations/union.xml
scilab/modules/elementary_functions/macros/union.sci
scilab/modules/elementary_functions/tests/unit_tests/union.tst [new file with mode: 0644]

index 41ea73a..54cc114 100644 (file)
@@ -219,6 +219,7 @@ Feature changes and additions on 6.1.1
 * `mprintf`, `msprintf` and `mfprintf` can now print input booleans, as `0`|`1` or as `T`|`F`.
 * `setdiff` now supports input booleans and sparse matrices (boolean or numeric).
 * `intersect` is extended to any sparse boolean or numeric arrays, in all simple, 'c' or 'r' modes.
+* `union` now support boolean, sparse boolean, and sparse numerical matrices.
 
 Help pages:
 -----------
@@ -403,6 +404,7 @@ Bug Fixes
 * [#16571](https://bugzilla.scilab.org/16571): `mfile2sci` had several issues when converting the NOT ~ operator: 1) `~(1-1)` was converted into `~1-1` instead of `~(1-1)`  2) ~ applied to an integer expression yielded an error from `convert2double`  3) `~i` was converted into `~%i` instead of `~abs(%i)`.
 * [#16586](https://bugzilla.scilab.org/16586): `mfile2sci`: The `prettyprintoutput` flag badly managed appended comments.
 * [#16596](https://bugzilla.scilab.org/16596): Concatenating encoded integers with sparse numeric data was not possible. 
+* [#16608](https://bugzilla.scilab.org/16608): `union` did not support input boolean, sparse boolean, nor sparse numerical matrices. The result of `union(complexA, complexB)` was wrongly conjugate.
 * [#16609](https://bugzilla.scilab.org/16609): `bitcmp` needed to be upgraded for Scilab 6.
 * [#16622](https://bugzilla.scilab.org/16622): `inv` could no longer be overloaded for hypermatrices of decimal or complex numbers.
 * [#16623](https://bugzilla.scilab.org/16623): `rand(2,2,2)^2` yielded a wrong result instead of trying to call the `%s_p_s` overload for input hypermatrices.
index 9f2de27..756f86b 100644 (file)
@@ -2,8 +2,8 @@
 <!--
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2008 - INRIA
- *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
+ * Copyright (C) 2020 - Samuel GOUGEON
  *
  * This file is hereby licensed under the terms of the GNU GPL v2.0,
  * pursuant to article 5.3.4 of the CeCILL v.2.1.
  * along with this program.
  *
  -->
-<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="union" 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: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="union" xml:lang="en">
     <refnamediv>
         <refname>union</refname>
-        <refpurpose>extract union components of a vector</refpurpose>
+        <refpurpose>
+            Set of all elements, rows, or columns of two arrays, without duplicates
+        </refpurpose>
     </refnamediv>
     <refsynopsisdiv>
         <title>Syntax</title>
         <synopsis>
-            [v [,ka, kb] ] = union(a,b)
-            [v [,ka, kb] ] = union(a,b,orient)
+            [v, ka, kb] = union(a, b)
+            [v, ka, kb] = union(a, b, orient)
         </synopsis>
     </refsynopsisdiv>
     <refsection>
         <title>Arguments</title>
         <variablelist>
             <varlistentry>
-                <term>a</term>
-                <listitem>
-                    <para>vector or matrix of numbers or strings</para>
-                </listitem>
-            </varlistentry>
-            <varlistentry>
-                <term>b</term>
+                <term>a, b</term>
                 <listitem>
-                    <para>vector of real numbers or strings</para>
+                    arrays of booleans, numbers, or text. Sparse boolean or numerical matrices
+                    are accepted. The types of <varname>a</varname>
+                    and of <varname>b</varname> can be distinct but compatible for concatenation.
+                    <para/>
                 </listitem>
             </varlistentry>
             <varlistentry>
                 <term>orient</term>
                 <listitem>
-                    <para>flag with possible values : 1 or "r", 2 or "c".</para>
+                    orientation of the processing:
+                    <itemizedlist>
+                        <listitem>
+                            1 or "r": the union is performed over the rows.
+                        </listitem>
+                        <listitem>
+                            2 or "c": the union is performed over the columns.
+                        </listitem>
+                    </itemizedlist>
+                    <para/>
                 </listitem>
             </varlistentry>
             <varlistentry>
                 <term>v</term>
                 <listitem>
-                    <para>row vector or matrix of numbers or strings</para>
+                    row vector, or matrix. <varname>v</varname>'s data type
+                    is the type of <literal>[a(:) ; b(:)]</literal>'s result.
+                    <para/>
                 </listitem>
             </varlistentry>
             <varlistentry>
                 <term>ka</term>
                 <listitem>
-                    <para>row vector of integers</para>
+                    row vector of integers: Indices in <varname>a</varname> of <varname>v</varname>
+                    elements/rows/columns coming from <varname>a</varname>.
+                    <para/>
                 </listitem>
             </varlistentry>
             <varlistentry>
                 <term>kb</term>
                 <listitem>
-                    <para>row vector of integers</para>
+                    row vector of integers: Indices in <varname>b</varname> of <varname>v</varname>
+                    remaining elements/rows/columns coming from <varname>b</varname>.
+                    <para/>
                 </listitem>
             </varlistentry>
         </variablelist>
@@ -70,7 +87,7 @@
         <title>Description</title>
         <para>
             <literal>union(a,b)</literal> returns a sorted row vector which
-            retains the unique entries of <literal>[a(:);b(:)]</literal>.
+            retains the unique entries of <literal>[a(:) ; b(:)]</literal>.
         </para>
         <para>
             <literal>union(a,b,"r")</literal> or
     <refsection>
         <title>Examples</title>
         <programlisting role="example"><![CDATA[
-A=round(5*rand(10,1));
-B=round(5*rand(7,1));
+A = [6  7  6 ; 5  8  3 ];
+B = [1  7  1  0  6 ];
+
+union(A, B)
+[u, ka, kb] = union(A, B)
+     ]]></programlisting>
+     <screen><![CDATA[
+--> union(A, B)
+ ans  =
+   0.   1.   3.   5.   6.   7.   8.
+
+--> [u, ka, kb] = union(A, B)
+ u  =
+   0.   1.   3.   5.   6.   7.   8.
+ ka  =
+   6.   2.   1.   3.   4.
+ kb  =
+   4.   1.
+]]></screen>
+        <para/>
+        <programlisting role="example"><![CDATA[
+A = ["a" "b" "a" "c" "c" "b"
+     "b" "c" "a" "b" "c" "c" ];
+B = ["b" "a" "c" "c" "b" "a"
+     "a" "c" "b" "b" "b" "b" ];
+
+[U, ka, kb] = union(A, B, "c")
+     ]]></programlisting>
+     <screen><![CDATA[
+--> [U, ka, kb] = union(A, B, "c")
+ U  =
+  "a"  "a"  "a"  "b"  "b"  "b"  "c"  "c"
+  "a"  "b"  "c"  "a"  "b"  "c"  "b"  "c"
+
+ ka  =
+   3.   1.   2.   4.   5.
+
+ kb  =
+   2.   1.   5.
+]]></screen>
+        <para/>
+        <programlisting role="example"><![CDATA[
+[F, T] = (%f, %t);
+A = sparse([T T F T F T ; F F F F T T ; T F F F F T ]); full(A)
+B = sparse([F F T T F F ; T T T T T T ; T F T T T F ]); full(B)
+
+[U, ka, kb] = union(A, B, "c");
+issparse(U)
+full(U), ka, kb
+     ]]></programlisting>
+     <screen><![CDATA[
+--> A = sparse([T T F T F T ; F F F F T T ; T F F F F T ]); full(A)
+ ans  =
+  T T F T F T
+  F F F F T T
+  T F F F F T
+
+--> B = sparse([F F T T F F ; T T T T T T ; T F T T T F ]); full(B)
+ ans  =
+  F F T T F F
+  T T T T T T
+  T F T T T F
 
-union(A,B)
-[N,ka,kb]=union(A,B)
+--> [U, ka, kb] = union(A, B, "c");
+--> issparse(U)
+ ans  =
+  T
 
-union('a'+string(A),'b'+string(B))
- ]]></programlisting>
+--> full(U), ka, kb
+ ans  =
+  F F F T T T
+  F T T F F T
+  F F T F T T
+
+ ka  =
+   3.   5.   2.   1.   6.
+ kb  =
+   1.
+]]></screen>
     </refsection>
     <refsection role="see also">
         <title>See also</title>
         <simplelist type="inline">
             <member>
-                <link linkend="unique">unique</link>
+                <link linkend="brackets">brackets</link>
             </member>
             <member>
-                <link linkend="gsort">gsort</link>
+                <link linkend="unique">unique</link>
             </member>
         </simplelist>
     </refsection>
+    <refsection role="history">
+        <title>History</title>
+        <revhistory>
+            <revision>
+                <revnumber>6.1.0</revnumber>
+                <revdescription>
+                    Extension to boolean matrices.
+                </revdescription>
+            </revision>
+            <revision>
+                <revnumber>6.1.1</revnumber>
+                <revdescription>
+                    Extension to sparse boolean, sparse real, and sparse complex matrices.
+                </revdescription>
+            </revision>
+        </revhistory>
+    </refsection>
 </refentry>
index 6e4fefb..13b3f59 100644 (file)
@@ -1,61 +1,89 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<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="union" xml:lang="fr">
+<!--
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2008 - INRIA
+ * Copyright (C) 2012 - 2016 - Scilab Enterprises
+ * Copyright (C) 2020 - Samuel GOUGEON
+ *
+ * This file is hereby licensed under the terms of the GNU GPL v2.0,
+ * pursuant to article 5.3.4 of the CeCILL v.2.1.
+ * This file was originally licensed under the terms of the CeCILL v2.1,
+ * and continues to be available under such terms.
+ * For more information, see the COPYING file which you should have received
+ * along with this program.
+ *
+ -->
+<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="union" xml:lang="fr">
     <refnamediv>
         <refname>union</refname>
-        <refpurpose>extrait les composantes distinctes issues de l'union de deux
-            vecteurs
+        <refpurpose>
+            Ensemble de tous les éléments, lignes ou colonnes de deux matrices, sans doublons
         </refpurpose>
     </refnamediv>
     <refsynopsisdiv>
         <title>Séquence d'appel</title>
         <synopsis>
-            [v [,ka, kb] ] = union(a,b)
-            [v [,ka, kb] ] = union(a,b,orient)
+            [v, ka, kb] = union(a, b)
+            [v, ka, kb] = union(a, b, orient)
         </synopsis>
     </refsynopsisdiv>
     <refsection>
         <title>Paramètres</title>
         <variablelist>
             <varlistentry>
-                <term>a</term>
+                <term>a, b</term>
                 <listitem>
-                    <para>vecteur ou matrice de nombres ou de chaînes de
-                        caractères.
-                    </para>
-                </listitem>
-            </varlistentry>
-            <varlistentry>
-                <term>b</term>
-                <listitem>
-                    <para>vecteur ou matrice de nombres ou de chaînes de
-                        caractères.
-                    </para>
+                    tableaux de booléens, de nombres, ou de texte. Matrices creuses booléennes
+                    ou numériques acceptées. Les types de <varname>a</varname> et de
+                    <varname>b</varname> peuvent être distincts mais compatibles pour la
+                    concaténation.
+                    <para/>
                 </listitem>
             </varlistentry>
             <varlistentry>
                 <term>orient</term>
+                Orientation du traitement :
                 <listitem>
-                    <para>flag qui peut prendre les valeurs : 1 ou "r", 2 ou "c".</para>
+                    <itemizedlist>
+                        <listitem>
+                            1 or "r": union des lignes de <varname>a</varname> et de
+                            <varname>b</varname>.
+                        </listitem>
+                        <listitem>
+                            2 or "c": union des colonnes de <varname>a</varname> et de
+                            <varname>b</varname>.
+                        </listitem>
+                    </itemizedlist>
+                    <para/>
                 </listitem>
             </varlistentry>
             <varlistentry>
                 <term>v</term>
                 <listitem>
-                    <para>vecteur ou matrice de nombres ou de chaînes de
-                        caractères.
-                    </para>
+                    vecteur ligne, ou matrice. Le type de <varname>v</varname> est celui
+                    de <literal>[a(:) ; b(:)]</literal>.
+                    <para/>
                 </listitem>
             </varlistentry>
             <varlistentry>
                 <term>ka</term>
                 <listitem>
-                    <para>vecteur ligne d'entier.</para>
+                    vecteur ligne d'entiers : rangs dans <varname>a</varname> des
+                    éléments/lignes/colonnes de <varname>v</varname> présents dans
+                    <varname>a</varname>.
+                    <para/>
                 </listitem>
             </varlistentry>
             <varlistentry>
                 <term>kb</term>
                 <listitem>
-                    <para>vecteur ligne d'entier.</para>
+                    vecteur ligne d'entiers : rangs dans <varname>b</varname> des
+                    éléments/lignes/colonnes de <varname>v</varname> restants issus de
+                    <varname>b</varname>.
+                    <para/>
                 </listitem>
             </varlistentry>
         </variablelist>
     <refsection>
         <title>Exemples</title>
         <programlisting role="example"><![CDATA[
-A=round(5*rand(10,1));
-B=round(5*rand(7,1));
+A = [6  7  6 ; 5  8  3 ];
+B = [1  7  1  0  6 ];
 
-union(A,B)
-[N,ka,kb]=union(A,B)
+union(A, B)
+[u, ka, kb] = union(A, B)
+     ]]></programlisting>
+     <screen><![CDATA[
+--> union(A, B)
+ ans  =
+   0.   1.   3.   5.   6.   7.   8.
 
-union('a'+string(A),'b'+string(B))
- ]]></programlisting>
+--> [u, ka, kb] = union(A, B)
+ u  =
+   0.   1.   3.   5.   6.   7.   8.
+ ka  =
+   6.   2.   1.   3.   4.
+ kb  =
+   4.   1.
+]]></screen>
+        <para/>
+        <programlisting role="example"><![CDATA[
+A = ["a" "b" "a" "c" "c" "b"
+     "b" "c" "a" "b" "c" "c" ];
+B = ["b" "a" "c" "c" "b" "a"
+     "a" "c" "b" "b" "b" "b" ];
+
+[U, ka, kb] = union(A, B, "c")
+     ]]></programlisting>
+     <screen><![CDATA[
+--> [U, ka, kb] = union(A, B, "c")
+ U  =
+  "a"  "a"  "a"  "b"  "b"  "b"  "c"  "c"
+  "a"  "b"  "c"  "a"  "b"  "c"  "b"  "c"
+
+ ka  =
+   3.   1.   2.   4.   5.
+
+ kb  =
+   2.   1.   5.
+]]></screen>
+        <para/>
+        <programlisting role="example"><![CDATA[
+[F, T] = (%f, %t);
+A = sparse([T T F T F T ; F F F F T T ; T F F F F T ]); full(A)
+B = sparse([F F T T F F ; T T T T T T ; T F T T T F ]); full(B)
+
+[U, ka, kb] = union(A, B, "c");
+issparse(U)
+full(U), ka, kb
+     ]]></programlisting>
+     <screen><![CDATA[
+--> A = sparse([T T F T F T ; F F F F T T ; T F F F F T ]); full(A)
+ ans  =
+  T T F T F T
+  F F F F T T
+  T F F F F T
+
+--> B = sparse([F F T T F F ; T T T T T T ; T F T T T F ]); full(B)
+ ans  =
+  F F T T F F
+  T T T T T T
+  T F T T T F
+
+--> [U, ka, kb] = union(A, B, "c");
+--> issparse(U)
+ ans  =
+  T
+
+--> full(U), ka, kb
+ ans  =
+  F F F T T T
+  F T T F F T
+  F F T F T T
+
+ ka  =
+   3.   5.   2.   1.   6.
+ kb  =
+   1.
+]]></screen>
     </refsection>
     <refsection role="see also">
         <title>Voir aussi</title>
         <simplelist type="inline">
             <member>
-                <link linkend="unique">unique</link>
+                <link linkend="brackets">brackets</link>
             </member>
             <member>
-                <link linkend="gsort">gsort</link>
+                <link linkend="unique">unique</link>
             </member>
         </simplelist>
     </refsection>
+    <refsection role="history">
+        <title>Historique</title>
+        <revhistory>
+            <revision>
+                <revnumber>6.1.0</revnumber>
+                <revdescription>
+                    Extension aux matrices booléennes.
+                </revdescription>
+            </revision>
+            <revision>
+                <revnumber>6.1.1</revnumber>
+                <revdescription>
+                    Extension aux matrices creuses booléennes, réelles, ou complexes.
+                </revdescription>
+            </revision>
+        </revhistory>
+    </refsection>
 </refentry>
index 9f3cd54..563439e 100644 (file)
@@ -1,10 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-
 <!--
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2008 - INRIA
- *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
+ * Copyright (C) 2020 - Samuel GOUGEON
  *
  * This file is hereby licensed under the terms of the GNU GPL v2.0,
  * pursuant to article 5.3.4 of the CeCILL v.2.1.
  * along with this program.
  *
  -->
-
-<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="union" xml:lang="ja">
-
+<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="union" xml:lang="ja">
     <refnamediv>
-
         <refname>union</refname>
-
         <refpurpose>ベクトルの和集合要素を展開</refpurpose>
-
     </refnamediv>
-
     <refsynopsisdiv>
-
         <title>呼び出し手順</title>
-
         <synopsis>
-
-            [v [,ka, kb] ] = union(a,b)
-
-            [v [,ka, kb] ] = union(a,b,orient)
-
+            [v, ka, kb] = union(a, b)
+            [v, ka, kb] = union(a, b, orient)
         </synopsis>
-
     </refsynopsisdiv>
-
     <refsection>
-
         <title>引数</title>
-
         <variablelist>
-
-            <varlistentry>
-
-                <term>a</term>
-
-                <listitem>
-
-                    <para>数値または文字列のベクトルまたは行列</para>
-
-                </listitem>
-
-            </varlistentry>
-
             <varlistentry>
-
-                <term>b</term>
-
+                <term>a, b</term>
                 <listitem>
-
-                    <para>実数または文字列のベクトル</para>
-
+                    arrays of booleans, numbers, or strings. Sparse boolean or numerical matrices
+                    are accepted. The types of <varname>a</varname>
+                    and <varname>b</varname> can be distinct but compatible for concatenation.
+                    <para/>
                 </listitem>
-
             </varlistentry>
-
             <varlistentry>
-
                 <term>orient</term>
-
-                <listitem>
-
-                    <para>フラグで次の値を指定可能 : 1 または "r", 2 または "c".</para>
-
-                </listitem>
-
+                    orientation of the processing:
+                    <itemizedlist>
+                        <listitem>
+                            1 or "r": the union is performed over rows.
+                        </listitem>
+                        <listitem>
+                            2 or "c": the union is performed over columns.
+                        </listitem>
+                    </itemizedlist>
+                    <para/>
             </varlistentry>
-
             <varlistentry>
-
                 <term>v</term>
-
                 <listitem>
-
-                    <para>行ベクトルまたは数値または文字列の行列</para>
-
+                    row vector, or matrix. <varname>v</varname> data type
+                    is the <literal>[a(:) ; b(:)]</literal>'s one.
+                    <para/>
                 </listitem>
-
             </varlistentry>
-
             <varlistentry>
-
                 <term>ka</term>
-
                 <listitem>
-
-                    <para>整数の行ベクトル</para>
-
+                    row vector of integers: Indices in <varname>a</varname> of <varname>v</varname>
+                    elements/rows/columns coming from <varname>a</varname>.
+                    <para/>
                 </listitem>
-
             </varlistentry>
-
             <varlistentry>
-
                 <term>kb</term>
-
                 <listitem>
-
-                    <para>整数の行ベクトル</para>
-
+                    row vector of integers: Indices in <varname>b</varname> of <varname>v</varname>
+                    remaining elements/rows/columns coming from <varname>b</varname>.
+                    <para/>
                 </listitem>
-
             </varlistentry>
-
         </variablelist>
-
     </refsection>
-
     <refsection>
-
         <title>説明</title>
-
         <para>
-
             <literal>union(a,b)</literal> は,
-
             <literal>[a(:);b(:)]</literal>のユニークなエントリ
-
             を保持するソート済みの行ベクトルを返します.
-
         </para>
-
         <para>
-
             <literal>union(a,b,"r")</literal> または
-
             <literal>union(a,b,1)</literal>は,
-
             辞書式に昇順にソートされた
-
             <literal>a</literal> および <literal>b</literal>
-
             のユニークな行の和集合により作成された行列を返します.
-
             この場合,行列<literal>a</literal>および<literal>b</literal>
-
             の列の数は同じである必要があります.
-
         </para>
-
         <para>
-
             <literal>union(a,b,"c")</literal> または
-
             <literal>union(a,b,2)</literal>は,
-
             辞書式に昇順にソートされた
-
             <literal>a</literal> および <literal>b</literal>
-
             のユニークな列の和集合により作成された行列を返します.
-
             この場合,行列<literal>a</literal>および<literal>b</literal>
-
             の行の数は同じである必要があります.
-
         </para>
-
         <para>
-
             <literal>[v,ka,kb]=union(a,b)</literal> は,
-
             <literal>v</literal>がソートされたエントリ
-
             <literal>a(ka)</literal> および <literal>b(kb)</literal>
-
             組みあわせとなるような
-
             添字ベクトル<literal>ka</literal> および <literal>kb</literal>も返します.
-
         </para>
-
     </refsection>
-
     <refsection>
-
         <title>例</title>
-
         <programlisting role="example"><![CDATA[
-A=round(5*rand(10,1));
-B=round(5*rand(7,1));
-union(A,B)
-[N,ka,kb]=union(A,B)
-union('a'+string(A),'b'+string(B))
- ]]></programlisting>
-
+A = [6  7  6 ; 5  8  3 ];
+B = [1  7  1  0  6 ];
+
+union(A, B)
+[u, ka, kb] = union(A, B)
+     ]]></programlisting>
+     <screen><![CDATA[
+--> union(A, B)
+ ans  =
+   0.   1.   3.   5.   6.   7.   8.
+
+--> [u, ka, kb] = union(A, B)
+ u  =
+   0.   1.   3.   5.   6.   7.   8.
+ ka  =
+   6.   2.   1.   3.   4.
+ kb  =
+   4.   1.
+]]></screen>
+        <para/>
+        <programlisting role="example"><![CDATA[
+A = ["a" "b" "a" "c" "c" "b"
+     "b" "c" "a" "b" "c" "c" ];
+B = ["b" "a" "c" "c" "b" "a"
+     "a" "c" "b" "b" "b" "b" ];
+
+[U, ka, kb] = union(A, B, "c")
+     ]]></programlisting>
+     <screen><![CDATA[
+--> [U, ka, kb] = union(A, B, "c")
+ U  =
+  "a"  "a"  "a"  "b"  "b"  "b"  "c"  "c"
+  "a"  "b"  "c"  "a"  "b"  "c"  "b"  "c"
+
+ ka  =
+   3.   1.   2.   4.   5.
+
+ kb  =
+   2.   1.   5.
+]]></screen>
+        <para/>
+        <programlisting role="example"><![CDATA[
+[F, T] = (%f, %t);
+A = sparse([T T F T F T ; F F F F T T ; T F F F F T ]); full(A)
+B = sparse([F F T T F F ; T T T T T T ; T F T T T F ]); full(B)
+
+[U, ka, kb] = union(A, B, "c");
+issparse(U)
+full(U), ka, kb
+     ]]></programlisting>
+     <screen><![CDATA[
+--> A = sparse([T T F T F T ; F F F F T T ; T F F F F T ]); full(A)
+ ans  =
+  T T F T F T
+  F F F F T T
+  T F F F F T
+
+--> B = sparse([F F T T F F ; T T T T T T ; T F T T T F ]); full(B)
+ ans  =
+  F F T T F F
+  T T T T T T
+  T F T T T F
+
+--> [U, ka, kb] = union(A, B, "c");
+--> issparse(U)
+ ans  =
+  T
+
+--> full(U), ka, kb
+ ans  =
+  F F F T T T
+  F T T F F T
+  F F T F T T
+
+ ka  =
+   3.   5.   2.   1.   6.
+ kb  =
+   1.
+]]></screen>
     </refsection>
-
     <refsection role="see also">
-
         <title>参照</title>
-
         <simplelist type="inline">
-
             <member>
-
-                <link linkend="unique">unique</link>
-
+                <link linkend="brackets">brackets</link>
             </member>
-
             <member>
-
-                <link linkend="gsort">gsort</link>
-
+                <link linkend="unique">unique</link>
             </member>
-
         </simplelist>
-
     </refsection>
-
-</refentry>
-
+    <refsection role="history">
+        <title>履歴</title>
+        <revhistory>
+            <revision>
+                <revnumber>6.1.0</revnumber>
+                <revdescription>
+                    Extension to boolean matrices.
+                </revdescription>
+            </revision>
+            <revision>
+                <revnumber>6.1.1</revnumber>
+                <revdescription>
+                    Extension to sparse boolean, sparse real, and sparse complex matrices.
+                </revdescription>
+            </revision>
+        </revhistory>
+    </refsection>
+</refentry>
\ No newline at end of file
index c80ad92..bcb2de9 100644 (file)
@@ -2,8 +2,8 @@
 <!--
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2008 - INRIA
- *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
+ * Copyright (C) 2020 - Samuel GOUGEON
  *
  * This file is hereby licensed under the terms of the GNU GPL v2.0,
  * pursuant to article 5.3.4 of the CeCILL v.2.1.
  * along with this program.
  *
  -->
-<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:ns4="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="union" xml:lang="pt">
+<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink"
+          xmlns:svg="http://www.w3.org/2000/svg" xmlns:ns4="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="union" xml:lang="pt">
     <refnamediv>
         <refname>union</refname>
         <refpurpose>extrai componentes da união de um vetor</refpurpose>
     <refsynopsisdiv>
         <title>Seqüência de Chamamento</title>
         <synopsis>
-            [v [,ka, kb] ] = union(a,b)
-            [v [,ka, kb] ] = union(a,b,orient)
+            [v, ka, kb] = union(a, b)
+            [v, ka, kb] = union(a, b, orient)
         </synopsis>
     </refsynopsisdiv>
     <refsection>
         <title>Parâmetros</title>
         <variablelist>
             <varlistentry>
-                <term>a</term>
-                <listitem>
-                    <para>vetor ou matriz de números ou strings</para>
-                </listitem>
-            </varlistentry>
-            <varlistentry>
-                <term>b</term>
+                <term>a, b</term>
                 <listitem>
-                    <para>vetor ou matriz de números ou strings</para>
+                    matrizes de booleanos, números ou texto. Matrizes booleanas ou numéricas
+                    esparsas são aceitos. Os tipos de <varname>a</varname> et de
+                    <varname>b</varname> podem ser distintos, mas compatíveis para concatenação.
+                    <para/>
                 </listitem>
             </varlistentry>
             <varlistentry>
                 <term>orient</term>
                 <listitem>
-                    <para>flag com valores possíveis : 1 ou "r", 2 ou "c".</para>
+                    orientação do processamento :
+                    <itemizedlist>
+                        <listitem>
+                            1 ou "r": a união é realizada nas linhas.
+                        </listitem>
+                        <listitem>
+                            2 or "c": a união é realizada nas colunas.
+                        </listitem>
+                    </itemizedlist>
+                    <para/>
                 </listitem>
             </varlistentry>
             <varlistentry>
                 <term>v</term>
                 <listitem>
-                    <para>vetor linha ou matriz de números ou strings</para>
+                    vetor linha, ou matriz. O tipo de dados de <varname>v</varname>
+                    é o tipo de resultado <literal>[a(:) ; b(:)]</literal>.
+                    <para/>
                 </listitem>
             </varlistentry>
             <varlistentry>
                 <term>ka</term>
                 <listitem>
-                    <para>vetor linha de inteiros</para>
+                    vetor linha de inteiros: Índices em <varname>a</varname> de elementos /
+                    linhas / colunas de <varname>v</varname> vindos de <varname>a</varname>.
+                    <para/>
                 </listitem>
             </varlistentry>
             <varlistentry>
                 <term>kb</term>
                 <listitem>
-                    <para>vetor linha de inteiros</para>
+                    vetor linha de inteiros: Índices em <varname>b</varname> dos
+                    elementos / linhas / colunas restantes de <varname>v</varname>
+                    vindos de <varname>b</varname>.
+                    <para/>
                 </listitem>
             </varlistentry>
         </variablelist>
     <refsection>
         <title>Exemplos</title>
         <programlisting role="example"><![CDATA[
-A=round(5*rand(10,1));
-B=round(5*rand(7,1));
+A = [6  7  6 ; 5  8  3 ];
+B = [1  7  1  0  6 ];
+
+union(A, B)
+[u, ka, kb] = union(A, B)
+     ]]></programlisting>
+     <screen><![CDATA[
+--> union(A, B)
+ ans  =
+   0.   1.   3.   5.   6.   7.   8.
+
+--> [u, ka, kb] = union(A, B)
+ u  =
+   0.   1.   3.   5.   6.   7.   8.
+ ka  =
+   6.   2.   1.   3.   4.
+ kb  =
+   4.   1.
+]]></screen>
+        <para/>
+        <programlisting role="example"><![CDATA[
+A = ["a" "b" "a" "c" "c" "b"
+     "b" "c" "a" "b" "c" "c" ];
+B = ["b" "a" "c" "c" "b" "a"
+     "a" "c" "b" "b" "b" "b" ];
+
+[U, ka, kb] = union(A, B, "c")
+     ]]></programlisting>
+     <screen><![CDATA[
+--> [U, ka, kb] = union(A, B, "c")
+ U  =
+  "a"  "a"  "a"  "b"  "b"  "b"  "c"  "c"
+  "a"  "b"  "c"  "a"  "b"  "c"  "b"  "c"
+
+ ka  =
+   3.   1.   2.   4.   5.
+
+ kb  =
+   2.   1.   5.
+]]></screen>
+        <para/>
+        <programlisting role="example"><![CDATA[
+[F, T] = (%f, %t);
+A = sparse([T T F T F T ; F F F F T T ; T F F F F T ]); full(A)
+B = sparse([F F T T F F ; T T T T T T ; T F T T T F ]); full(B)
+
+[U, ka, kb] = union(A, B, "c");
+issparse(U)
+full(U), ka, kb
+     ]]></programlisting>
+     <screen><![CDATA[
+--> A = sparse([T T F T F T ; F F F F T T ; T F F F F T ]); full(A)
+ ans  =
+  T T F T F T
+  F F F F T T
+  T F F F F T
+
+--> B = sparse([F F T T F F ; T T T T T T ; T F T T T F ]); full(B)
+ ans  =
+  F F T T F F
+  T T T T T T
+  T F T T T F
 
-union(A,B)
-[N,ka,kb]=union(A,B)
+--> [U, ka, kb] = union(A, B, "c");
+--> issparse(U)
+ ans  =
+  T
 
-union('a'+string(A),'b'+string(B))
- ]]></programlisting>
+--> full(U), ka, kb
+ ans  =
+  F F F T T T
+  F T T F F T
+  F F T F T T
+
+ ka  =
+   3.   5.   2.   1.   6.
+ kb  =
+   1.
+]]></screen>
     </refsection>
     <refsection role="see also">
         <title>Ver Também</title>
         <simplelist type="inline">
             <member>
-                <link linkend="unique">unique</link>
+                <link linkend="brackets">brackets</link>
             </member>
             <member>
-                <link linkend="gsort">gsort</link>
+                <link linkend="unique">unique</link>
             </member>
         </simplelist>
     </refsection>
+    <refsection role="history">
+        <title>Histórico</title>
+        <revhistory>
+            <revision>
+                <revnumber>6.1.0</revnumber>
+                <revdescription>
+                    Extension to boolean matrices.
+                </revdescription>
+            </revision>
+            <revision>
+                <revnumber>6.1.1</revnumber>
+                <revdescription>
+                    Extension to sparse boolean, sparse real, and sparse complex matrices.
+                </revdescription>
+            </revision>
+        </revhistory>
+    </refsection>
 </refentry>
index e349bcc..b00dfcf 100644 (file)
@@ -2,8 +2,8 @@
 <!--
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2008 - INRIA
- *
  * Copyright (C) 2012 - 2016 - Scilab Enterprises
+ * Copyright (C) 2020 - Samuel GOUGEON
  *
  * This file is hereby licensed under the terms of the GNU GPL v2.0,
  * pursuant to article 5.3.4 of the CeCILL v.2.1.
  * along with this program.
  *
  -->
-<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="union" xml:lang="ru">
+<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="union" xml:lang="ru">
     <refnamediv>
         <refname>union</refname>
-        <refpurpose>выделяет объединение компонентов векторов</refpurpose>
+        <refpurpose>Множество всех элементов, строк или столбцов двух массивов без дубликатов</refpurpose>
     </refnamediv>
     <refsynopsisdiv>
         <title>Синтаксис</title>
         <synopsis>
-            [v [,ka, kb] ] = union(a,b)
-            [v [,ka, kb] ] = union(a,b,orient)
+            [v, ka, kb] = union(a, b)
+            [v, ka, kb] = union(a, b, orient)
         </synopsis>
     </refsynopsisdiv>
     <refsection>
         <title>Аргументы</title>
         <variablelist>
             <varlistentry>
-                <term>a</term>
-                <listitem>
-                    <para>вектор или матрица чисел или строк</para>
-                </listitem>
-            </varlistentry>
-            <varlistentry>
-                <term>b</term>
+                <term>a, b</term>
                 <listitem>
-                    <para>вектор вещественных числе или строк</para>
+                    массивы логических значений, чисел или текста. Допускаются разрежённые логические
+                    или числовые матрицы. Типы <varname>a</varname> и <varname>b</varname> могут
+                    отличаться, но должны быть совместимыми для конкатенации.
+                    <para/>
                 </listitem>
             </varlistentry>
             <varlistentry>
                 <term>orient</term>
                 <listitem>
-                    <para>флаг с возможными значениями: 1 или "r", 2 или "c".</para>
+                    направление обработки:
+                    <itemizedlist>
+                        <listitem>
+                            1 или "r": объединение выполняется по строкам;
+                        </listitem>
+                        <listitem>
+                            2 или "c": объеднение выполняется по столбцам.
+                        </listitem>
+                    </itemizedlist>
+                    <para/>
                 </listitem>
             </varlistentry>
             <varlistentry>
                 <term>v</term>
                 <listitem>
-                    <para>вектор-строка или матрица чисел или строк</para>
+                    вектор-строка или матрица. Тип данных <varname>v</varname> является типом
+                    результата <literal>[a(:) ; b(:)]</literal>.
+                    <para/>
                 </listitem>
             </varlistentry>
             <varlistentry>
                 <term>ka</term>
                 <listitem>
-                    <para>вектор-строка целых чисел</para>
+                    вектор-строка целых чисел: индексы в <varname>a</varname> элементов/строк/столбцов
+                    <varname>v</varname>, пришедшие из <varname>a</varname>.
+                    <para/>
                 </listitem>
             </varlistentry>
             <varlistentry>
                 <term>kb</term>
                 <listitem>
-                    <para>вектор-строка целых чисел</para>
+                    вектор-строка целых чисел: индексы в <varname>b</varname> оставшихся
+                    элементов/строк/столбцов <varname>v</varname>, пришедших из <varname>b</varname>.
+                    <para/>
                 </listitem>
             </varlistentry>
         </variablelist>
     <refsection>
         <title>Описание</title>
         <para>
-            <literal>union(a,b)</literal> возвращает отсортированный вектор-строку, который
+            <literal>union(a,b)</literal> возвращает отсортированную вектор-строку, которая
             содержит уникальные элементы <literal>[a(:);b(:)]</literal>.
         </para>
         <para>
             <literal>union(a,b,"r")</literal> или <literal>union(a,b,1)</literal>
             возвращает матрицу, сформированную объединением уникальных строк <literal>a</literal>
-            и <literal>b</literal>, отсортированную в лексикографическом порядке возрастания. В этом случае матрицы <literal>a</literal> и <literal>b</literal> должны иметь одинаковое количество столбцов.
+            и <literal>b</literal>, отсортированную в лексикографическом порядке возрастания.
+            В этом случае матрицы <literal>a</literal> и <literal>b</literal> должны иметь
+            одинаковое количество столбцов.
         </para>
         <para>
             <literal>union(a,b,"c")</literal> или <literal>union(a,b,2)</literal>
             возвращает матрицу, сформированную объединением уникальных столбцов
-            <literal>a</literal> and <literal>b</literal>, отсортированную в лексикографическом порядке возрастания. В этом случае матрицы <literal>a</literal> и <literal>b</literal> должны иметь одинаковое количество строк.
+            <literal>a</literal> и <literal>b</literal>, отсортированную в лексикографическом
+            порядке возрастания. В этом случае матрицы <literal>a</literal> и <literal>b</literal>
+            должны иметь одинаковое количество строк.
         </para>
         <para>
-            <literal>[v,ka,kb]=union(a,b)</literal> также возвращает векторы индексов     <literal>ka</literal> и <literal>kb</literal> такие, что <literal>v</literal> является
+            <literal>[v,ka,kb]=union(a,b)</literal> также возвращает векторы индексов
+            <literal>ka</literal> и <literal>kb</literal> такие, что <literal>v</literal> является
             сортированной комбинацией элементов <literal>a(ka)</literal> и
             <literal>b(kb)</literal>.
         </para>
     <refsection>
         <title>Примеры</title>
         <programlisting role="example"><![CDATA[
-A=round(5*rand(10,1));
-B=round(5*rand(7,1));
+A = [6  7  6 ; 5  8  3 ];
+B = [1  7  1  0  6 ];
+
+union(A, B)
+[u, ka, kb] = union(A, B)
+     ]]></programlisting>
+     <screen><![CDATA[
+--> union(A, B)
+ ans  =
+   0.   1.   3.   5.   6.   7.   8.
+
+--> [u, ka, kb] = union(A, B)
+ u  =
+   0.   1.   3.   5.   6.   7.   8.
+ ka  =
+   6.   2.   1.   3.   4.
+ kb  =
+   4.   1.
+]]></screen>
+        <para/>
+        <programlisting role="example"><![CDATA[
+A = ["a" "b" "a" "c" "c" "b"
+     "b" "c" "a" "b" "c" "c" ];
+B = ["b" "a" "c" "c" "b" "a"
+     "a" "c" "b" "b" "b" "b" ];
+
+[U, ka, kb] = union(A, B, "c")
+     ]]></programlisting>
+     <screen><![CDATA[
+--> [U, ka, kb] = union(A, B, "c")
+ U  =
+  "a"  "a"  "a"  "b"  "b"  "b"  "c"  "c"
+  "a"  "b"  "c"  "a"  "b"  "c"  "b"  "c"
+
+ ka  =
+   3.   1.   2.   4.   5.
+
+ kb  =
+   2.   1.   5.
+]]></screen>
+        <para/>
+        <programlisting role="example"><![CDATA[
+[F, T] = (%f, %t);
+A = sparse([T T F T F T ; F F F F T T ; T F F F F T ]); full(A)
+B = sparse([F F T T F F ; T T T T T T ; T F T T T F ]); full(B)
+
+[U, ka, kb] = union(A, B, "c");
+issparse(U)
+full(U), ka, kb
+     ]]></programlisting>
+     <screen><![CDATA[
+--> A = sparse([T T F T F T ; F F F F T T ; T F F F F T ]); full(A)
+ ans  =
+  T T F T F T
+  F F F F T T
+  T F F F F T
+
+--> B = sparse([F F T T F F ; T T T T T T ; T F T T T F ]); full(B)
+ ans  =
+  F F T T F F
+  T T T T T T
+  T F T T T F
 
-union(A,B)
-[N,ka,kb]=union(A,B)
+--> [U, ka, kb] = union(A, B, "c");
+--> issparse(U)
+ ans  =
+  T
 
-union('a'+string(A),'b'+string(B))
- ]]></programlisting>
+--> full(U), ka, kb
+ ans  =
+  F F F T T T
+  F T T F F T
+  F F T F T T
+
+ ka  =
+   3.   5.   2.   1.   6.
+ kb  =
+   1.
+]]></screen>
     </refsection>
     <refsection role="see also">
         <title>Смотрите также</title>
         <simplelist type="inline">
             <member>
-                <link linkend="unique">unique</link>
+                <link linkend="brackets">квадратные скобки</link>
             </member>
             <member>
-                <link linkend="gsort">gsort</link>
+                <link linkend="unique">unique</link>
             </member>
         </simplelist>
     </refsection>
+    <refsection role="history">
+        <title>История</title>
+        <revhistory>
+            <revision>
+                <revnumber>6.1.0</revnumber>
+                <revdescription>
+                    Расширение до логических матриц.
+                </revdescription>
+            </revision>
+            <revision>
+                <revnumber>6.1.1</revnumber>
+                <revdescription>
+                    Расширение до разреженных логических, разреженных вещественных и разреженных
+                    комплексных матриц.
+                </revdescription>
+            </revision>
+        </revhistory>
+    </refsection>
 </refentry>
index 3c2875a..ed75f90 100644 (file)
@@ -1,7 +1,6 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) INRIA
+// Copyright (C) INRIA - Serge STEER
 // Copyright (C) DIGITEO - 2011 - Allan CORNET
-//
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
 //
 // This file is hereby licensed under the terms of the GNU GPL v2.0,
 
 function [x,ka,kb] = union(a, b, orient)
     // returns the union of  unique components of  vector a and b
-    // author Serge Steer INRIA
 
     rhs = argn(2);
     if rhs < 2 then
         error(msprintf(gettext("%s: Wrong number of input argument(s): %d expected.\n"), "union", 2));
     end
 
+    // early return for empty sparse
+    if issparse(a) || issparse(b) then
+        esb = sparse(%f); esb(1) = [];
+        if isequal(a,sparse([])) | isequal(a,esb) then
+            a = []
+        end
+        if isequal(b,sparse([])) | isequal(b,esb) then
+            b = []
+        end
+    end
+
     if rhs < 3 then
         if argn(1)==1 then
-            x=unique([a(:);b(:)])
-            x=x';
+            x = unique([a(:);b(:)])
+            x = x.';
         else
-            kab=[1:size(a,"*"), -(1:size(b,"*"))]
-            [x,k]=unique([a(:);b(:)])
-            x=x'
-            kab=kab(k)
-            ka=kab(kab>0)
-            kb=-kab(kab<0)
+            kab = [1:size(a,"*"), -(1:size(b,"*"))]
+            [x,k] = unique([a(:);b(:)])
+            x = x.'
+            kab = kab(k)
+            ka = kab(kab>0)
+            kb = -kab(kab<0)
         end
     else
-        if  orient==1|orient=="r" then
+        if  orient==1 | orient=="r" then
             if argn(1)==1 then
-                x=unique([a;b],"r")
+                x = unique([a;b],"r")
             else
-                kab=[1:size(a,"r"), -(1:size(b,"r"))]
-                [x,k]=unique([a;b],"r")
-                kab=kab(k)
-                ka=kab(kab>0)
-                kb=-kab(kab<0)
+                kab = [1:size(a,"r"), -(1:size(b,"r"))]
+                [x,k] = unique([a;b],"r")
+                kab = kab(k)
+                ka = kab(kab>0)
+                kb = -kab(kab<0)
             end
-        elseif orient==2|orient=="c" then
+        elseif orient==2 | orient=="c" then
             if argn(1)==1 then
-                x=unique([a b],"c")
+                x = unique([a b],"c")
             else
-                kab=[1:size(a,"c"), -(1:size(b,"c"))]
-                [x,k]=unique([a b],"c")
-                kab=kab(k)
-                ka=kab(kab>0)
-                kb=-kab(kab<0)
+                kab = [1:size(a,"c"), -(1:size(b,"c"))]
+                [x,k] = unique([a b],"c")
+                kab = kab(k)
+                ka = kab(kab>0)
+                kb = -kab(kab<0)
             end
 
         else
diff --git a/scilab/modules/elementary_functions/tests/unit_tests/union.tst b/scilab/modules/elementary_functions/tests/unit_tests/union.tst
new file mode 100644 (file)
index 0000000..70d858f
--- /dev/null
@@ -0,0 +1,136 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2020 - Samuel Gougeon
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// unit test of union()
+//
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+// <-- ENGLISH IMPOSED -->
+
+// Empty - empty
+// -------------
+assert_checkequal(union([],[]), []);
+assert_checkequal(union([],[],"r"), []);
+assert_checkequal(union([],[],"c"), []);
+[u,ka,kb] = union([],[]);
+assert_checkequal(u, []);
+assert_checkequal(ka, []);
+assert_checkequal(kb, []);
+
+// empty, a
+// --------
+assert_checkequal(union(1,[]),1);
+assert_checkequal(union([1 2],[]),[1 2]);
+assert_checkequal(union([1 2]',[]),[1 2]);
+assert_checkequal(union([1 2 ; 2 0],[]),[0 1 2]);
+assert_checkequal(union(cat(3,[1 2],[0 1]), 0),[0 1 2]);
+
+assert_checkequal(union([],1),1);
+assert_checkequal(union([], [1 2]),[1 2]);
+assert_checkequal(union([],[1 2]'),[1 2]);
+
+a  = [4 1 %nan -3 %inf 10 %nan -%inf %inf 1];
+ref = [-%inf -3 1 4 10 %inf %nan %nan];
+assert_checkequal(union(a, []), ref);
+assert_checkequal(union(a, [], "r"), a);
+assert_checkequal(union(a, [], "c"), ref);
+
+assert_checkequal(union([], a), ref);
+assert_checkequal(union([], a, "r"), a);
+assert_checkequal(union([], a, "c"), ref);
+
+// With Booleans
+// -------------
+[T, F] = (%t, %f);
+a = [T T F T F T
+     F F F F T T
+     T F F F F T ];
+b  = [F F T T F F
+      T T T T T T
+      T F T T T F ];
+Ref = [F F F T T T
+       F T T F F T
+       F F T F T T ];
+assert_checkequal(union(T,T),T);
+assert_checkequal(union(T,F),[F T]);
+assert_checkequal(union([T F]',F),[F T]);
+assert_checkequal(union([T F]',F),[F T]);
+assert_checkequal(union(cat(3,a,b),F),[F T]);
+// "c", "r"
+assert_checkequal(union(a,b,"c"),Ref);
+[v, ka, kb] = union(a, b, "c");
+assert_checkequal(list(v, ka, kb), list(Ref,[3 5 2 1 6], 1));
+
+assert_checkequal(union(a',b',"r"), Ref');
+[v, ka, kb] = union(a', b', "r");
+assert_checkequal(list(v, ka, kb), list(Ref',[3 5 2 1 6], 1));
+
+// With real numbers
+// -----------------
+a  = [2.   2.   1.   2.   0.
+      0.   2.   1.   2.   1. ];
+b  = [1.   0.   2.   0.   1.
+      2.   0.   0.   1.   1. ];
+Ref= [0.   0.   1.   1.   2.   2.
+      0.   1.   1.   2.   0.   2. ];
+assert_checkequal(union(a,b,"c"), Ref);
+assert_checkequal(union(a',b',"r"), Ref');
+[v,ka,kb] = union(a,b,"c");
+assert_checkequal(list(v,ka,kb), list(Ref,[5 3 1 2],[2 1]));
+[v,ka,kb] = union(a',b',"r");
+assert_checkequal(list(v,ka,kb), list(Ref',[5 3 1 2],[2 1]));
+
+
+// ===========
+// With sparse
+// ===========
+es = sparse([]);
+esb = sparse(%t); esb(1) = [];
+
+// Element-wise processing
+// -----------------------
+// Results with sparse input(s) must be equal to those got with dense inputs,
+//  but be sparse.
+objects = list(es, sparse(0), sparse(5), sparse([2 %nan 0 -3 0 4]), ..
+    sparse([2 0 -3 0 %inf 4]'), sparse([0 2 -%inf ; %nan 0 2]), ..
+    sparse(complex([0 1 %inf -1 %nan],[3 -%inf 2 -1 0])), ..
+    esb, sparse(%t), sparse(%f), sparse([%t %f %f %t %f]), ..
+    sparse([%t %f %f %t %f]'), sparse([%t %f %t ; %t %t %f]));
+for a = objects
+    for b = objects
+        uref = union(full(a), full(b));
+        u = union(a, b);
+        if ~((isequal(a,es) | isequal(a,esb)) & (isequal(b,es) | isequal(b,esb)))
+            assert_checktrue(issparse(u));
+        else
+            assert_checkequal(u,[]);
+        end
+        assert_checkequal(full(u), uref);
+
+        [uref, karef, kbref] = union(full(a), full(b));
+        [u, ka, kb] = union(a, b);
+        assert_checkequal(ka, karef);
+        assert_checkequal(kb, kbref);
+    end
+end
+// "r" and "c" processing
+// ----------------------
+add = list(0, %i);  // real, then complex numbers
+for p = add
+    a  = [2.   2.   1.   2.   0.
+          0.   2.   1.   2.   1. ] + p;
+    b  = [1.   0.   2.   0.   1.
+          2.   0.   0.   1.   1. ] + p;
+    Ref= [0.   0.   1.   1.   2.   2.
+          0.   1.   1.   2.   0.   2. ] + p;
+    [a, b, Ref] = (sparse(a), sparse(b), sparse(Ref));
+    assert_checkequal(union(a,b,"c"), Ref);
+    assert_checkequal(union(a',b',"r"), Ref');
+    [v,ka,kb] = union(a,b,"c");
+    assert_checkequal(list(v,ka,kb), list(Ref,[5 3 1 2],[2 1]));
+    [v,ka,kb] = union(a',b',"r");
+    assert_checkequal(list(v,ka,kb), list(Ref',[5 3 1 2],[2 1]));
+end