complex() extended to sparses 04/21504/9
Samuel GOUGEON [Tue, 16 Jun 2020 12:05:04 +0000 (14:05 +0200)]
Change-Id: I0b26f8f13fb8a4813db483f022c296c678e2b70a

scilab/modules/elementary_functions/help/en_US/complex/complex.xml
scilab/modules/elementary_functions/help/ja_JP/complex/complex.xml
scilab/modules/elementary_functions/help/ru_RU/complex/complex.xml
scilab/modules/elementary_functions/macros/complex.sci
scilab/modules/elementary_functions/tests/unit_tests/complex.dia.ref [deleted file]
scilab/modules/elementary_functions/tests/unit_tests/complex.tst

index c08a8e1..ec98e08 100644 (file)
@@ -2,8 +2,8 @@
 <!--
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2011 - DIGITEO - Michael Baudin
- *
  * 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.
           xmlns:scilab="http://www.scilab.org" xml:id="complex" xml:lang="en">
     <refnamediv>
         <refname>complex</refname>
-        <refpurpose>Create a complex number.</refpurpose>
+        <refpurpose>Build an array of complex numbers from their parts</refpurpose>
     </refnamediv>
     <refsynopsisdiv>
         <title>Syntax</title>
         <synopsis>
-            c=complex(a)
-            c=complex(a,b)
+            c = complex(u)
+            c = complex(a, b)
         </synopsis>
     </refsynopsisdiv>
     <refsection>
         <title>Arguments</title>
         <variablelist>
             <varlistentry>
-                <term>a</term>
-                <listitem>
-                    <para>
-                        a 1-by-1 or a n-by-m real matrix of doubles, the real part.
-                        If <literal>a</literal> has an imaginary part, an error
-                        is generated.
-                    </para>
-                </listitem>
-            </varlistentry>
-            <varlistentry>
-                <term>b</term>
+                <term>u, a, b</term>
                 <listitem>
-                    <para>
-                        a 1-by-1 or a n-by-m real matrix of doubles, the imaginary part (default b=0).
-                        If <literal>b</literal> has an imaginary part, an error
-                        is generated.
-                    </para>
+                    scalars, vectors, matrices or hypermatrices of real numbers.
+                    If both <varname>a</varname> and <varname>b</varname> are not
+                    scalars, they must have the same sizes.
+                    <para/>
                 </listitem>
             </varlistentry>
             <varlistentry>
                 <term>c</term>
                 <listitem>
-                    <para>a n-by-m complex matrix of doubles, the complex number.</para>
+                    array of complex numbers, of the size of <varname>u</varname> or of
+                    <varname>a</varname> and <varname>b</varname>.
+                    If <varname>u</varname> is sparse, or if <varname>a</varname> and
+                    <varname>b</varname> have the same sizes and both are sparse,
+                    then <varname>c</varname> is also sparse.
+                    Otherwise <varname>c</varname> is dense-encoded.
+                    <para/>
                 </listitem>
             </varlistentry>
         </variablelist>
     <refsection>
         <title>Description</title>
         <para>
-            c=complex(a) creates a complex number from its real part <literal>a</literal>
-            and zero as the imaginary part.
+            <emphasis role="bold">c = complex(u)</emphasis> creates an array
+            of complex numbers from their real parts <varname>u</varname>,
+            and zero as imaginary parts.
         </para>
         <para>
-            c=complex(a,b) creates a complex number from its real part <literal>a</literal>
-            and imaginary part <literal>b</literal>.
+            <emphasis role="bold">c = complex(a,b)</emphasis> creates an array
+            of complex numbers from their respective real parts <varname>a</varname>
+            and their imaginary parts <varname>b</varname>.
         </para>
         <para>
-            This function is a substitute for expressions such as <literal>a+%i*b</literal>,
-            especially in cases where the complex arithmetic interferes with particular
-            floating point numbers such as <literal>%inf</literal> or
-            <literal>%nan</literal>.
+            This function is equivalent to <literal>a + imult(b)</literal>, which
+            handles properly special Inf and NaN real and imaginary parts.
         </para>
     </refsection>
     <refsection>
@@ -87,26 +82,26 @@ complex(1,2)
 complex([1 2],[3 4])
  ]]></programlisting>
         <para>
-            If <literal>a</literal> only is specified, then the imaginary
+            If <varname>a</varname> only is specified, then the imaginary
             part is set to zero.
         </para>
         <programlisting role="example"><![CDATA[
 complex([1 2 3])
  ]]></programlisting>
         <para>
-            If <literal>a</literal> is a scalar and <literal>b</literal>
-            is a matrix, then the result <literal>c</literal> has the same
-            size as <literal>b</literal>.
-            Similarly, if <literal>b</literal> is a scalar and <literal>a</literal>
-            is a matrix, then the result <literal>c</literal> has the same
-            size as <literal>a</literal>.
+            If <varname>a</varname> is a scalar and <varname>b</varname>
+            is a matrix, then the result <varname>c</varname> has the same
+            size as <varname>b</varname>.
+            Similarly, if <varname>b</varname> is a scalar and <varname>a</varname>
+            is a matrix, then the result <varname>c</varname> has the same
+            size as <varname>a</varname>.
         </para>
         <programlisting role="example"><![CDATA[
 c = complex([1 2 3], 4)
 c = complex(1, [2 3 4])
  ]]></programlisting>
         <para>
-            If <literal>a</literal> and <literal>b</literal> are two
+            If <varname>a</varname> and <varname>b</varname> are two
             matrices with different sizes, an error is generated, as in the
             following session.
         </para>
@@ -118,29 +113,41 @@ at line      33 of function complex called by :
 complex(ones(2,3),ones(4,5))
  ]]></screen>
         <para>
-            The purpose of the <literal>complex</literal> function is to manage
-            IEEE floating point numbers such as Nans or Infinities.
-            In the following example, we show that creating a complex number where
-            the real and imaginary parts are complex is not straightforward if
-            we use the complex arithmetic.
-            This is because the product <literal>%i</literal> times <literal>%inf</literal>
-            is evaluated as <literal>(0+%i) * (%inf+%i*0)</literal>.
-            This produces the intermediate expression <literal>0*%inf</literal>,
-            which is <literal>%nan</literal>.
+            With special real or/and imaginary parts:
         </para>
+        <programlisting role="example"><![CDATA[
+r = [0   0    0 %inf %inf %inf %nan %nan %nan].';
+i = [0 %inf %nan  0  %inf %nan   0  %inf %nan].';
+[r, i]
+
+// Then let's compare complex(r, i) with r + i*%i :
+[complex(r,i), r+i*%i]
+ ]]></programlisting>
         <screen><![CDATA[
--->%inf+%i*%inf
+--> [r, i]
  ans  =
-    Nan + Inf
- ]]></screen>
-        <para>
-            The solution of this issue is to use the <literal>complex</literal>
-            function.
-        </para>
-        <screen><![CDATA[
--->complex(%inf,%inf)
+   0.    0.
+   0.    Inf
+   0.    Nan
+   Inf   0.
+   Inf   Inf
+   Inf   Nan
+   Nan   0.
+   Nan   Inf
+   Nan   Nan
+
+// Then let's compare complex(r, i) with r + i*%i :
+--> [complex(r,i), r+i*%i]
  ans  =
-    Inf + Inf
+   0.  + 0.i    0.  + 0.i
+   0.  + Infi   Nan + Infi
+   0.  + Nani   Nan + Nani
+   Inf + 0.i    Inf + 0.i
+   Inf + Infi   Nan + Infi
+   Inf + Nani   Nan + Nani
+   Nan + 0.i    Nan + 0.i
+   Nan + Infi   Nan + Infi
+   Nan + Nani   Nan + Nani
  ]]></screen>
     </refsection>
     <refsection role="see also">
@@ -154,4 +161,14 @@ complex(ones(2,3),ones(4,5))
             </member>
         </simplelist>
     </refsection>
+    <refsection role="history">
+        <title>History</title>
+        <revhistory>
+            <revision>
+                <revnumber>6.1.1</revnumber>
+                <revdescription>Extension to sparse arrays.
+                </revdescription>
+            </revision>
+        </revhistory>
+    </refsection>
 </refentry>
index a460b04..90095a7 100644 (file)
@@ -2,8 +2,8 @@
 <!--
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2011 - DIGITEO - Michael Baudin
- *
  * 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.
           xmlns:scilab="http://www.scilab.org" xml:id="complex" xml:lang="ja">
     <refnamediv>
         <refname>complex</refname>
-        <refpurpose>複素数を計算する.</refpurpose>
+        <refpurpose>複素数を計算する</refpurpose>
     </refnamediv>
     <refsynopsisdiv>
         <title>呼び出し手順</title>
         <synopsis>
-            c=complex(a)
-            c=complex(a,b)
+            c = complex(u)
+            c = complex(a, b)
         </synopsis>
     </refsynopsisdiv>
     <refsection>
         <title>引数</title>
         <variablelist>
             <varlistentry>
-                <term>a</term>
-                <listitem>
-                    <para>
-                        1行1列またはn行m列の倍精度実数行列, 実部.
-                        <literal>a</literal> が虚部を有する場合,
-                        エラーが発生します.
-                    </para>
-                </listitem>
-            </varlistentry>
-            <varlistentry>
-                <term>b</term>
+                <term>u, a, b</term>
                 <listitem>
-                    <para>
-                        1行1列またはn行m列の倍精度実数行列, 虚部 (デフォルト b=0).
-                        <literal>b</literal> が虚部を有する場合,
-                        エラーが発生します.
-                    </para>
+                    scalars, vectors, matrices or hypermatrices of real numbers.
+                    If both <varname>a</varname> and <varname>b</varname> are not
+                    scalars, they must have the same sizes.
+                    <para/>
                 </listitem>
             </varlistentry>
             <varlistentry>
                 <term>c</term>
                 <listitem>
-                    <para>n行m列の倍精度複素行列, 複素数.</para>
+                    array of complex numbers, of the size of <varname>u</varname> or of
+                    <varname>a</varname> and <varname>b</varname>.
+                    If <varname>u</varname> is sparse, or if <varname>a</varname> and
+                    <varname>b</varname> have the same sizes and both are sparse,
+                    then <varname>c</varname> is also sparse.
+                    Otherwise <varname>c</varname> is dense-encoded.
+                    <para/>
                 </listitem>
             </varlistentry>
         </variablelist>
     <refsection>
         <title>説明</title>
         <para>
-            c=complex(a) は, <literal>a</literal>を実部,
+            <emphasis role="bold">c = complex(u)</emphasis> は, <varname>u</varname>を実部,
             0 を虚部とする複素数を作成します.
         </para>
         <para>
-            c=complex(a,b) は実部<literal>a</literal> ,
-            虚部<literal>b</literal>の複素数を作成します.
+            <emphasis role="bold">c = complex(a,b)</emphasis> は実部<varname>a</varname> ,
+            虚部<varname>b</varname>の複素数を作成します.
         </para>
         <para>
-            この関数は,
-            特に複素数演算が<literal>%inf</literal> または<literal>%nan</literal>
-            のような特定の浮動小数点数と競合する場合に,
-            <literal>a+%i*b</literal>のような式の代替手段となります.
+            This function is equivalent to <literal>a + imult(b)</literal>, which
+            handles properly special Inf and NaN real and imaginary parts.
         </para>
     </refsection>
     <refsection>
@@ -86,25 +79,25 @@ complex(1,2)
 complex([1 2],[3 4])
  ]]></programlisting>
         <para>
-            <literal>a</literal> のみが指定された場合, 虚部は0に設定されます.
+            <varname>a</varname> のみが指定された場合, 虚部は0に設定されます.
         </para>
         <programlisting role="example"><![CDATA[
 complex([1 2 3])
  ]]></programlisting>
         <para>
-            <literal>a</literal> がスカラーで <literal>b</literal> が
-            行列の場合, 結果 <literal>c</literal> は,
-            <literal>b</literal>と同じ大きさとなります.
-            同様に, <literal>b</literal> がスカラーで <literal>a</literal>
-            が行列の場合, 結果 <literal>c</literal> は
-            <literal>a</literal>と同じ大きさになります.
+            <varname>a</varname> がスカラーで <varname>b</varname> が
+            行列の場合, 結果 <varname>c</varname> は,
+            <varname>b</varname>と同じ大きさとなります.
+            同様に, <varname>b</varname> がスカラーで <varname>a</varname>
+            が行列の場合, 結果 <varname>c</varname> は
+            <varname>a</varname>と同じ大きさになります.
         </para>
         <programlisting role="example"><![CDATA[
 c = complex([1 2 3], 4)
 c = complex(1, [2 3 4])
  ]]></programlisting>
         <para>
-            <literal>a</literal> と <literal>b</literal> が
+            <varname>a</varname> と <varname>b</varname> が
             異なる大きさの行列の場合,以下のセッションのような
             エラーが発生します.
         </para>
@@ -116,28 +109,41 @@ at line      33 of function complex called by :
 complex(ones(2,3),ones(4,5))
  ]]></screen>
         <para>
-            <literal>complex</literal> 関数の目的は,NaNや無限大のような
-            IEEE 浮動小数点数を管理することです.
-            以下の例では,複素数演算を使用する場合,
-            実部と虚部が複合体となる複素数を作成するのは
-            容易ではないことを示します.
-            これは,<literal>%i</literal> と <literal>%inf</literal>の積が
-            <literal>(0+%i) * (%inf+%i*0)</literal>と評価されるためです.
-            この結果は,中間式<literal>0*%inf</literal>,つまり,
-            <literal>%nan</literal>となります.
+            With special real or/and imaginary parts:
         </para>
+        <programlisting role="example"><![CDATA[
+r = [0   0    0 %inf %inf %inf %nan %nan %nan].';
+i = [0 %inf %nan  0  %inf %nan   0  %inf %nan].';
+[r, i]
+
+// Then let's compare complex(r, i) with r + i*%i :
+[complex(r,i), r+i*%i]
+ ]]></programlisting>
         <screen><![CDATA[
--->%inf+%i*%inf
+--> [r, i]
  ans  =
-    Nan + Inf
- ]]></screen>
-        <para>
-            この問題の解決策は <literal>complex</literal>関数を使用することです.
-        </para>
-        <screen><![CDATA[
--->complex(%inf,%inf)
+   0.    0.
+   0.    Inf
+   0.    Nan
+   Inf   0.
+   Inf   Inf
+   Inf   Nan
+   Nan   0.
+   Nan   Inf
+   Nan   Nan
+
+// Then let's compare complex(r, i) with r + i*%i :
+--> [complex(r,i), r+i*%i]
  ans  =
-    Inf + Inf
+   0.  + 0.i    0.  + 0.i
+   0.  + Infi   Nan + Infi
+   0.  + Nani   Nan + Nani
+   Inf + 0.i    Inf + 0.i
+   Inf + Infi   Nan + Infi
+   Inf + Nani   Nan + Nani
+   Nan + 0.i    Nan + 0.i
+   Nan + Infi   Nan + Infi
+   Nan + Nani   Nan + Nani
  ]]></screen>
     </refsection>
     <refsection role="see also">
@@ -151,4 +157,14 @@ complex(ones(2,3),ones(4,5))
             </member>
         </simplelist>
     </refsection>
+    <refsection role="history">
+        <title>履歴</title>
+        <revhistory>
+            <revision>
+                <revnumber>6.1.1</revnumber>
+                <revdescription>Extension to sparse arrays.
+                </revdescription>
+            </revision>
+        </revhistory>
+    </refsection>
 </refentry>
index f603d6c..08518ed 100644 (file)
@@ -2,8 +2,8 @@
 <!--
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2011 - DIGITEO - Michael Baudin
- *
  * 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.
           xmlns:scilab="http://www.scilab.org" xml:id="complex" xml:lang="ru">
     <refnamediv>
         <refname>complex</refname>
-        <refpurpose>Создание комплексного числа.</refpurpose>
+        <refpurpose>Построение массива комплексных чисел по их частям</refpurpose>
     </refnamediv>
     <refsynopsisdiv>
         <title>Синтаксис</title>
         <synopsis>
-            c=complex(a)
-            c=complex(a,b)
+            c = complex(u)
+            c = complex(a, b)
         </synopsis>
     </refsynopsisdiv>
     <refsection>
         <title>Аргументы</title>
         <variablelist>
             <varlistentry>
-                <term>a</term>
-                <listitem>
-                    <para>
-                        вещественная матрица значений двойной точности размером 1 на 1 или
-                        <literal>n</literal> на <literal>m</literal>, реальная часть.
-                        Если <literal>a</literal> имеет мнимую часть, то сформируется ошибка.
-                    </para>
-                </listitem>
-            </varlistentry>
-            <varlistentry>
-                <term>b</term>
+                <term>u, a, b</term>
                 <listitem>
-                    <para>
-                        вещественная матрица значений двойной точности размером 1 на 1 или
-                        <literal>n</literal> на <literal>m</literal>, реальная часть (по умолчанию
-                        <literal>b=0</literal>).
-                        Если <literal>b</literal> имеет мнимую часть, то сформируется ошибка.
-                    </para>
+                    скаляры, векторы, матрицы и гиперматрицы вещественных чисел.
+                    Если оба <varname>a</varname> и <varname>b</varname> не скаляры,
+                    то они должны быть одинакового размера.
+                    <para/>
                 </listitem>
             </varlistentry>
             <varlistentry>
                 <term>c</term>
                 <listitem>
-                    <para>
-                        комплексная матрица значений двойной точности размером <literal>n</literal> на
-                        <literal>m</literal>, комплексное число.
-                    </para>
+                    Array of complex numbers, of the size of <varname>u</varname> or of
+                    <varname>a</varname> and <varname>b</varname>.
+                    If <varname>u</varname> is sparse, or if <varname>a</varname> and
+                    <varname>b</varname> have the same sizes and both are sparse,
+                    то <varname>c</varname> является также разрежённой.
+                    В противном случае <varname>c</varname> является плотной.
+                    <para/>
                 </listitem>
             </varlistentry>
         </variablelist>
     <refsection>
         <title>Описание</title>
         <para>
-            <literal>c=complex(a)</literal> создаёт комплексное число из его реальной части
-            <literal>a</literal> и нуля в качестве мнимой части.
+            <emphasis role="bold">c = complex(u)</emphasis> создаёт комплексное число из
+            его реальной части <varname>u</varname> и нуля в качестве мнимой части.
         </para>
         <para>
-            <literal>c=complex(a,b)</literal> создаёт комплексное число из его реальной части
-            <literal>a</literal> и мнимой части <literal>b</literal>.
+            <emphasis role="bold">c = complex(a, b)</emphasis> создаёт комплексное число из его реальной части
+            <varname>a</varname> и мнимой части <varname>b</varname>.
         </para>
         <para>
-            Эта функция является заменой для таких выражений как <literal>a+%i*b</literal>,
-            особенно в случаях, когда комплексная арифметика пересекается с особыми числами с
-            плавающей запятой, такими как <literal>%inf</literal> или <literal>%nan</literal>.
+            Эта функция эквивалентна <literal>a + imult(b)</literal>, и должным
+            образом управляет специальными Inf и NaN вещественной и мнимой частями.
         </para>
     </refsection>
     <refsection>
@@ -89,25 +79,25 @@ complex(1,2)
 complex([1 2],[3 4])
  ]]></programlisting>
         <para>
-            Если определено только <literal>a</literal>, то мнимая часть устанавливается равной нулю.
+            Если определено только <varname>a</varname>, то мнимая часть устанавливается равной нулю.
         </para>
         <programlisting role="example"><![CDATA[
 complex([1 2 3])
  ]]></programlisting>
         <para>
-            Если <literal>a</literal> является скаляром, а <literal>b</literal>
-            является матрицей, то результат <literal>c</literal> имеет тот же размер, что и
-            <literal>b</literal>.
-            Аналогично, если <literal>a</literal> является матрицей, а <literal>b</literal> является
-            скаляром, то результат <literal>c</literal> имеет тот же размер, что и
-            <literal>a</literal>.
+            Если <varname>a</varname> является скаляром, а <varname>b</varname>
+            является матрицей, то результат <varname>c</varname> имеет тот же размер, что и
+            <varname>b</varname>.
+            Аналогично, если <varname>a</varname> является матрицей, а <varname>b</varname> является
+            скаляром, то результат <varname>c</varname> имеет тот же размер, что и
+            <varname>a</varname>.
         </para>
         <programlisting role="example"><![CDATA[
 c = complex([1 2 3], 4)
 c = complex(1, [2 3 4])
  ]]></programlisting>
         <para>
-            Если <literal>a</literal> и <literal>b</literal> являются матрицами разных размеров,
+            Если <varname>a</varname> и <varname>b</varname> являются матрицами разных размеров,
             то сформируется ошибка, как в следующем примере.
         </para>
         <screen><![CDATA[
@@ -118,27 +108,41 @@ at line      33 of function complex called by :
 complex(ones(2,3),ones(4,5))
  ]]></screen>
         <para>
-            Целью функции <literal>complex</literal> является управление числами с плавающей запятой,
-            такими как нечисловые значения (<literal>Nan</literal>) или бесконечность
-            (<literal>Inf</literal>).
-            На следующем примере мы покажем, что создание комплексного числа, у которого
-            реальная  и мнимая части являются комплексными, не простое дело, если мы используем
-            комплексную арифметику. Это из-за того, что произведение <literal>%i</literal> на
-            <literal>%inf</literal> вычисляется как <literal>(0+%i) * (%inf+%i*0)</literal>.
-            Это даёт промежуточное выражение <literal>0*%inf</literal>, которое равно <literal>%nan</literal>.
+            При специальных вещественной или/и мнимой частях:
         </para>
+        <programlisting role="example"><![CDATA[
+r = [0   0    0 %inf %inf %inf %nan %nan %nan].';
+i = [0 %inf %nan  0  %inf %nan   0  %inf %nan].';
+[r, i]
+
+// Затем сравним complex(r, i) и r + i*%i :
+[complex(r,i), r+i*%i]
+ ]]></programlisting>
         <screen><![CDATA[
--->%inf+%i*%inf
+--> [r, i]
  ans  =
-    Nan + Inf
- ]]></screen>
-        <para>
-            Решением этой проблемы является использование функции <literal>complex</literal>.
-        </para>
-        <screen><![CDATA[
--->complex(%inf,%inf)
+   0.    0.
+   0.    Inf
+   0.    Nan
+   Inf   0.
+   Inf   Inf
+   Inf   Nan
+   Nan   0.
+   Nan   Inf
+   Nan   Nan
+
+// Затем сравним complex(r, i) и r + i*%i :
+--> [complex(r,i), r+i*%i]
  ans  =
-    Inf + Inf
+   0.  + 0.i    0.  + 0.i
+   0.  + Infi   Nan + Infi
+   0.  + Nani   Nan + Nani
+   Inf + 0.i    Inf + 0.i
+   Inf + Infi   Nan + Infi
+   Inf + Nani   Nan + Nani
+   Nan + 0.i    Nan + 0.i
+   Nan + Infi   Nan + Infi
+   Nan + Nani   Nan + Nani
  ]]></screen>
     </refsection>
     <refsection role="see also">
@@ -152,4 +156,15 @@ complex(ones(2,3),ones(4,5))
             </member>
         </simplelist>
     </refsection>
+    <refsection role="history">
+        <title>История</title>
+        <revhistory>
+            <revision>
+                <revnumber>6.1.1</revnumber>
+                <revdescription>
+                    Расширение до разрежённых массивов.
+                </revdescription>
+            </revision>
+        </revhistory>
+    </refsection>
 </refentry>
index 898e108..d786587 100644 (file)
@@ -1,8 +1,8 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) INRIA - Farid BELAHCENE
 // Copyright (C) 2011 - DIGITEO - Michael Baudin
-//
 // 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.
 // For more information, see the COPYING file which you should have received
 // along with this program.
 
-function  y=complex(varargin)
+function  y = complex(varargin)
 
     // COMPLEX function
-    // Given the real part and the imaginary part this function constructs the complex form : y=complex(a,b) returns y=a+b*i
+    // Given the real part and the imaginary part this function constructs the complex form :
+    //  y = complex(a,b) returns y = a + b*i
     // Inputs :
     //  a, b : real scalars/vectors/matrices
     // output :
@@ -27,18 +28,30 @@ function  y=complex(varargin)
 
     // Get input arguments
     a = varargin(1)
-    if ( rhs == 1 ) then
-        b = zeros(a)
+    if rhs == 1 then
+        if issparse(a)
+            b = spzeros(a)
+        else
+            b = zeros(a)
+        end
     else
         b = varargin(2)
     end
     //
     // Check type of input arguments
-    if ( typeof(a)<>"constant" ) then
-        error(msprintf(gettext("%s: Wrong type for argument #%d: Matrix expected.\n"),"complex",1));
+    if and(type(a)<>[1 4 5 6 8]) then
+        error(msprintf(gettext("%s: Argument #%d: Decimal numbers expected.\n"),"complex",1));
+    elseif or(type(a)==[4 6])
+        a = a*1
+    elseif type(a)==8
+        a = double(a)
     end
-    if ( typeof(b)<>"constant" ) then
-        error(msprintf(gettext("%s: Wrong type for argument #%d: Matrix expected.\n"),"complex",2));
+    if and(type(b)<>[1 4 5 6 8]) then
+        error(msprintf(gettext("%s: Argument #%d: Decimal numbers expected.\n"),"complex",2));
+    elseif or(type(b)==[4 6])
+        b = b*1
+    elseif type(b)==8
+        b = double(b)
     end
     //
     // Check size
@@ -47,13 +60,17 @@ function  y=complex(varargin)
     end
     //
     // Check content of input arguments
-    if ( ~isreal(a) ) then
+    if ~isreal(a,0) then
         error(msprintf(gettext("%s: Wrong type for input argument #%d: Real matrix expected.\n"),"complex",1));
+    else
+        a = real(a)
     end
-    if ( ~isreal(b) ) then
+    if ~isreal(b,0) then
         error(msprintf(gettext("%s: Wrong type for input argument #%d: Real matrix expected.\n"),"complex",2));
+    else
+        b = real(b)
     end
 
     // Proceed...
-    y = a+imult(b);
+    y = a + imult(b)
 endfunction
diff --git a/scilab/modules/elementary_functions/tests/unit_tests/complex.dia.ref b/scilab/modules/elementary_functions/tests/unit_tests/complex.dia.ref
deleted file mode 100644 (file)
index bfa9d26..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-// =============================================================================
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) 2011 - DIGITEO - Michael Baudin
-//
-//  This file is distributed under the same license as the Scilab package.
-// =============================================================================
-// <-- CLI SHELL MODE -->
-function [flag,errmsg] = assert_equal ( computed , expected )
-    //  Check that computed and expected are equal.
-    function flag = comparedoubles ( computed , expected )
-        [cnonan , cnumb] = mythrownan(computed)
-        [enonan , enumb] = mythrownan(expected)
-        if ( and(enonan == cnonan) & and(enumb == cnumb) ) then
-            flag = %t
-        else
-            flag = %f
-        end
-    endfunction
-    function [nonan,numb] = mythrownan(x)
-        [lhs,rhs]=argn(0)
-        if ( rhs<>1 ) then 
-            error(msprintf(gettext("%s: Wrong number of input argument: %d expected.\n"),"thrownan",1))
-        end
-        numb=find(bool2s(~isnan(x)))
-        nonan=x(~isnan(x))
-    endfunction
-    [lhs,rhs]=argn()
-    if ( rhs <> 2 ) then
-        errmsg = sprintf ( gettext ( "%s: Wrong number of input arguments: %d expected.\n") , "assert_checkequal" , 2 )
-        error(errmsg)
-    end
-    //
-    // Check types of variables
-    if ( typeof(computed) <> typeof(expected) ) then
-        errmsg = sprintf ( gettext ( "%s: Incompatible input arguments #%d and #%d: Same types expected.\n" ) , "assert_checkequal" , 1 , 2 )
-        error(errmsg)
-    end
-    //
-    // Check sizes of variables
-    ncom = size(computed)
-    nexp = size(expected)
-    if ( or(ncom <> nexp) ) then
-        errmsg = sprintf ( gettext ( "%s: Incompatible input arguments #%d and #%d: Same sizes expected.\n") , "assert_checkequal" , 1 , 2 )
-        error(errmsg)
-    end  
-    //
-    if ( type(computed) == 1 & type(expected) == 1 ) then
-        // These are two matrices of doubles
-        cisreal = isreal(computed)
-        eisreal = isreal(expected)
-        if ( cisreal & ~eisreal ) then
-            errmsg = sprintf ( gettext ( "%s: Computed is real, but expected is complex.") , "assert_checkequal" )
-            error(errmsg)
-        end
-        if ( ~cisreal & eisreal ) then
-            errmsg = sprintf ( gettext ( "%s: Computed is complex, but expected is real.") , "assert_checkequal" )
-            error(errmsg)
-        end
-        if ( cisreal & eisreal ) then
-            flag = comparedoubles ( computed , expected )
-        else
-            flagreal = comparedoubles ( real(computed) , real(expected) )
-            if ( flagreal ) then
-                flagimag = comparedoubles ( imag(computed) , imag(expected) )
-                flag = flagimag
-            else
-                flag = %f
-            end
-        end
-    else
-        if ( and ( computed == expected ) ) then
-            flag = %t
-        else
-            flag = %f
-        end
-    end
-    if ( flag == %t ) then
-        errmsg = ""
-    else
-        // Change the message if the matrix contains more than one value
-        if ( size(expected,"*") == 1 ) then
-            estr = string(expected)
-        else
-            estr = "[" + string(expected(1)) + " ...]"
-        end
-        if ( size(computed,"*") == 1 ) then
-            cstr = string(computed)
-        else
-            cstr = "[" + string(computed(1)) + " ...]"
-        end
-        errmsg = msprintf(gettext("%s: Assertion failed: expected = %s while computed = %s"),"assert_checkequal",estr,cstr)
-        if ( lhs < 2 ) then
-            // If no output variable is given, generate an error
-            error ( errmsg )
-        end
-    end
-endfunction
-c = complex(1,2);
-assert_equal([real(c);imag(c)],[1;2]);
-//
-c = complex([1 2],[3 4]);
-assert_equal([real(c);imag(c)],[1 2;3 4]);
-//
-c = complex(%inf,%inf);
-assert_equal([real(c);imag(c)],[%inf;%inf]);
-//
-c = complex(%inf,%nan);
-assert_equal([real(c);imag(c)],[%inf;%nan]);
-//
-c = complex(%nan,%nan);
-assert_equal([real(c);imag(c)],[%nan;%nan]);
-//
-c = complex(%nan,%inf);
-assert_equal([real(c);imag(c)],[%nan;%inf]);
-//
-c = complex(0,%nan);
-assert_equal([real(c);imag(c)],[0;%nan]);
-//
-c = complex(0,%inf);
-assert_equal([real(c);imag(c)],[0;%inf]);
-//
-c = complex(1);
-assert_equal([real(c);imag(c)],[1;0]);
-//
-c = complex([1 2]);
-assert_equal([real(c);imag(c)],[1 2;0 0]);
-//
-c = complex([1 2 3], 4);
-assert_equal([real(c);imag(c)],[1 2 3;4 4 4]);
-//
-c = complex(1, [2 3 4]);
-assert_equal([real(c);imag(c)],[1 1 1;2 3 4]);
index 1fdfe2f..4a6f2f8 100644 (file)
 // =============================================================================
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) 2011 - DIGITEO - Michael Baudin
+// Copyright (C) 2020 - Samuel GOUGEON
 //
 //  This file is distributed under the same license as the Scilab package.
 // =============================================================================
 
 // <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
 
-function [flag,errmsg] = assert_equal ( computed , expected )
-    //  Check that computed and expected are equal.
-
-    function flag = comparedoubles ( computed , expected )
-        [cnonan , cnumb] = mythrownan(computed)
-        [enonan , enumb] = mythrownan(expected)
-        if ( and(enonan == cnonan) & and(enumb == cnumb) ) then
-            flag = %t
-        else
-            flag = %f
-        end
-    endfunction
-
-    function [nonan,numb] = mythrownan(x)
-        [lhs,rhs]=argn(0)
-        if ( rhs<>1 ) then 
-            error(msprintf(gettext("%s: Wrong number of input argument: %d expected.\n"),"thrownan",1))
-        end
-        numb=find(bool2s(~isnan(x)))
-        nonan=x(~isnan(x))
-    endfunction
-
-    [lhs,rhs]=argn()
-    if ( rhs <> 2 ) then
-        errmsg = sprintf ( gettext ( "%s: Wrong number of input arguments: %d expected.\n") , "assert_checkequal" , 2 )
-        error(errmsg)
-    end
-    //
-    // Check types of variables
-    if ( typeof(computed) <> typeof(expected) ) then
-        errmsg = sprintf ( gettext ( "%s: Incompatible input arguments #%d and #%d: Same types expected.\n" ) , "assert_checkequal" , 1 , 2 )
-        error(errmsg)
-    end
-    //
-    // Check sizes of variables
-    ncom = size(computed)
-    nexp = size(expected)
-    if ( or(ncom <> nexp) ) then
-        errmsg = sprintf ( gettext ( "%s: Incompatible input arguments #%d and #%d: Same sizes expected.\n") , "assert_checkequal" , 1 , 2 )
-        error(errmsg)
-    end  
-    //
-    if ( type(computed) == 1 & type(expected) == 1 ) then
-        // These are two matrices of doubles
-        cisreal = isreal(computed)
-        eisreal = isreal(expected)
-        if ( cisreal & ~eisreal ) then
-            errmsg = sprintf ( gettext ( "%s: Computed is real, but expected is complex.") , "assert_checkequal" )
-            error(errmsg)
-        end
-        if ( ~cisreal & eisreal ) then
-            errmsg = sprintf ( gettext ( "%s: Computed is complex, but expected is real.") , "assert_checkequal" )
-            error(errmsg)
-        end
-        if ( cisreal & eisreal ) then
-            flag = comparedoubles ( computed , expected )
-        else
-            flagreal = comparedoubles ( real(computed) , real(expected) )
-            if ( flagreal ) then
-                flagimag = comparedoubles ( imag(computed) , imag(expected) )
-                flag = flagimag
-            else
-                flag = %f
-            end
-        end
-    else
-        if ( and ( computed == expected ) ) then
-            flag = %t
-        else
-            flag = %f
-        end
-    end
-    if ( flag == %t ) then
-        errmsg = ""
-    else
-        // Change the message if the matrix contains more than one value
-        if ( size(expected,"*") == 1 ) then
-            estr = string(expected)
-        else
-            estr = "[" + string(expected(1)) + " ...]"
-        end
-        if ( size(computed,"*") == 1 ) then
-            cstr = string(computed)
-        else
-            cstr = "[" + string(computed(1)) + " ...]"
-        end
-        errmsg = msprintf(gettext("%s: Assertion failed: expected = %s while computed = %s"),"assert_checkequal",estr,cstr)
-        if ( lhs < 2 ) then
-            // If no output variable is given, generate an error
-            error ( errmsg )
-        end
-    end
-endfunction
-
-
-
-
-c = complex(1,2);
-assert_equal([real(c);imag(c)],[1;2]);
-//
-c = complex([1 2],[3 4]);
-assert_equal([real(c);imag(c)],[1 2;3 4]);
-//
-c = complex(%inf,%inf);
-assert_equal([real(c);imag(c)],[%inf;%inf]);
-//
-c = complex(%inf,%nan);
-assert_equal([real(c);imag(c)],[%inf;%nan]);
-//
-c = complex(%nan,%nan);
-assert_equal([real(c);imag(c)],[%nan;%nan]);
-//
-c = complex(%nan,%inf);
-assert_equal([real(c);imag(c)],[%nan;%inf]);
-//
-c = complex(0,%nan);
-assert_equal([real(c);imag(c)],[0;%nan]);
-//
-c = complex(0,%inf);
-assert_equal([real(c);imag(c)],[0;%inf]);
-//
 c = complex(1);
-assert_equal([real(c);imag(c)],[1;0]);
+assert_checkequal([real(c);imag(c)],[1;0]);
+//
+c = complex(1,2);
+assert_checkequal([real(c);imag(c)],[1;2]);
 //
 c = complex([1 2]);
-assert_equal([real(c);imag(c)],[1 2;0 0]);
+assert_checkequal([real(c);imag(c)],[1 2;0 0]);
 //
 c = complex([1 2 3], 4);
-assert_equal([real(c);imag(c)],[1 2 3;4 4 4]);
+assert_checkequal([real(c);imag(c)],[1 2 3;4 4 4]);
 //
 c = complex(1, [2 3 4]);
-assert_equal([real(c);imag(c)],[1 1 1;2 3 4]);
+assert_checkequal([real(c);imag(c)],[1 1 1;2 3 4]);
+//
+c = complex([1 2],[3 4]);
+assert_checkequal([real(c);imag(c)],[1 2;3 4]);
+//
+L = list(1, [1 2], sparse(1), sparse([1 2]), %t, [%f %t], sparse(%t), sparse([%f %t]));
+for Re = L
+    assert_checkequal(issparse(complex(Re)), issparse(Re));
+    for Im = L
+        if ~issparse(Re) & ~issparse(Im)
+            continue
+        end
+        c = complex(Re, Im);
+        ref = and(size(Re)==size(Im)) && issparse(Re) && issparse(Im)
+        assert_checkequal(issparse(c), ref);
+    end
+end
+
+// Special values
+// --------------
+g = [-%inf 0 1 %inf %nan];
+// Generating all possible (rel, imag) combinations:
+r = g .*. ones(1,5);
+i = ones(1,5) .*. g;
+
+c = complex(r, i);
+assert_checkequal(real(c), r);
+assert_checkequal(imag(c), i);
+
+r = sparse(r);
+i = sparse(i);
+c = complex(r, i);
+assert_checkequal(real(c), r);
+assert_checkequal(imag(c), i);