* Bugs 15748/51/52/55 fixed: min & max hardly worked with sparses 99/20499/10
Samuel GOUGEON [Sun, 16 Sep 2018 18:22:23 +0000 (20:22 +0200)]
  - http://bugzilla.scilab.org/15748 :
     min(Sparse,"c"|"r") and max(Sparse,"c"|"r") returned vectors of zeros.
  - http://bugzilla.scilab.org/15751 :
     min(sparse([],[])) returns 0 instead of []. Same issue with max()
  - http://bugzilla.scilab.org/15752 :
     min() and max() did not ignore %nan in sparses
  - http://bugzilla.scilab.org/15755 :
     min() and max() did not allow mixing sparse inputs with scalars
  - The second output k was not implemented for sparses.

  Code enabled and simplified a lot:
    * min(A): the code was very complicated
    * min(A,"c") duplicated the code for min(A,"r"), while both cases
      just differ by a transposition.
    * With the new simple and fast implementation, min(row,"r"|"c") and
      min(col,"r"|"c") no longer uses a special processing
    * Processing min(A,B) duplicated the code for min(A,B,C,..)
  Other code improvement:
    * Inputs are now tested to be real.
  Help pages:
    * Syntaxes unfolded
    * Arguments were hardly documented.
    * Examples: There were no example for "c"|"r", nor with sparses
      Examples were not illustrated.
    * See also: strange was missing
    Too many changes => to be retranslated from en_US.

Change-Id: I5e322dc34b0c33067a435029065895c654f57fc8

15 files changed:
scilab/CHANGES.md
scilab/modules/elementary_functions/help/en_US/matrixoperations/max.xml
scilab/modules/elementary_functions/help/en_US/matrixoperations/min.xml
scilab/modules/elementary_functions/help/fr_FR/matrixoperations/max.xml [deleted file]
scilab/modules/elementary_functions/help/fr_FR/matrixoperations/min.xml [deleted file]
scilab/modules/elementary_functions/help/ja_JP/matrixoperations/max.xml [deleted file]
scilab/modules/elementary_functions/help/ja_JP/matrixoperations/min.xml [deleted file]
scilab/modules/elementary_functions/help/pt_BR/matrixoperations/max.xml [deleted file]
scilab/modules/elementary_functions/help/pt_BR/matrixoperations/min.xml [deleted file]
scilab/modules/elementary_functions/help/ru_RU/matrixoperations/max.xml
scilab/modules/elementary_functions/help/ru_RU/matrixoperations/min.xml
scilab/modules/elementary_functions/macros/%sp_max.sci
scilab/modules/elementary_functions/macros/%sp_min.sci
scilab/modules/elementary_functions/tests/unit_tests/max.dia.ref [deleted file]
scilab/modules/elementary_functions/tests/unit_tests/max.tst

index 7447851..68b991e 100644 (file)
@@ -255,6 +255,7 @@ input and output arguments.
    - When an error occurs, the output file is now closed and unlocked.
    - Encoded integers can now be saved in `-v4` format.
 * `sci2exp` now uses `%s` or `%z` in literal expressions of polynomials in `s` or `z`.
+* `min` and `max` hardly worked with sparse-encoded inputs. They are now fully enabled.
 
 Help pages:
 -----------
@@ -646,7 +647,11 @@ Known issues
 * [#15741](http://bugzilla.scilab.org/show_bug.cgi?id=15741):  Operations between 2 polynomials with distinct variables no longer called the corresponding overloads (Regression)
 * [#15746](http://bugzilla.scilab.org/show_bug.cgi?id=15746): `1/[1 2 3]` and `[1 2 3]'\1` did not raise an error
 * [#15747](http://bugzilla.scilab.org/show_bug.cgi?id=15747): no output in overloaded operator crashed Scilab
+* [#15748](http://bugzilla.scilab.org/show_bug.cgi?id=15748): `min(Sparse,"r"|"c")` and `max(Sparse,"r"|"c")` always returned vectors of zeros. In addition, with sparse inputs,  `min` and `max` did not compute indices as second output.
+* [#15751](http://bugzilla.scilab.org/show_bug.cgi?id=15751): `min(sparse([],[])) returned 0 instead of []. `max()` as well.
+* [#15752](http://bugzilla.scilab.org/show_bug.cgi?id=15752): `min` and `max` did not ignore `Nan` values in sparse inputs.
 * [#15753](http://bugzilla.scilab.org/show_bug.cgi?id=15753): `issparse()` returned 0 instead of 1 for sparse booleans.
+* [#15755](http://bugzilla.scilab.org/show_bug.cgi?id=15755): `min(A1,A2,..)` and `max(A1,A2,..)` did not allow mixing sparse with scalar inputs.
 * [#15757](http://bugzilla.scilab.org/show_bug.cgi?id=15757): The public function `xcosPalAddBlock` did not load scicos_scicoslib when needed, and then yielded an error. When the block is specified as a .sod file and the file does not exist, the error message was obscur.
 * [#15758](http://bugzilla.scilab.org/show_bug.cgi?id=15758): sparse([0 0],1) crashes scilab (regression)
 * [#15762](http://bugzilla.scilab.org/show_bug.cgi?id=15762): `error()` refused multiline error messages.
index 8bdd44f..6dea44d 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) 2018 - 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="max" 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="max" xml:lang="en">
     <refnamediv>
         <refname>max</refname>
         <refpurpose>maximum</refpurpose>
     </refnamediv>
     <refsynopsisdiv>
         <title>Syntax</title>
-        <synopsis>[m [,k]]=max(A)
-            [m [,k]]=max(A,'c')
-            [m [,k]]=max(A,'r')
-            [m [,k]]=max(A,'m')
-            [m [,k]]=max(A1,A2,...,An)
-            [m [,k]]=max(list(A1,A2,...,An))
+        <synopsis>
+            m = max(A)
+            Col = max(A, 'c')
+            Row = max(A, 'r'|'m')
+            M = max(A1, A2,..., An)
+            M = max(list(A1, A2,..., An))
+            [.., K] = max(..)
         </synopsis>
     </refsynopsisdiv>
     <refsection>
         <title>Arguments</title>
         <variablelist>
             <varlistentry>
-                <term>A</term>
+                <term>A, A1, ..., An</term>
+                <listitem>
+                    <para>
+                        scalars, vectors, matrices or hypermatrices of encoded integers or of real
+                        numbers, in dense or sparse format. They must have the same sizes, or be
+                        mixed with scalars (scalars are then implicitly expanded to the arrays sizes).
+                        Sparse arrays can't be mixed with dense ones, except with dense
+                        <emphasis>negative</emphasis> scalars.
+                    </para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>m</term>
+                <listitem>
+                    <para>
+                        single number = maximum of all values of <varname>A</varname> elements.
+                        Always in dense format, even when <varname>A</varname> is sparse encoded.
+                    </para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>Col</term>
                 <listitem>
-                    <para>real vector or matrix</para>
+                    <para>
+                        column vector if <varname>A</varname> is a 2D matrix, or hypermatrix of
+                        size(A) with size(A,2) set to 1: Maxima over columns (for each row).
+                        If <varname>A</varname> is sparse, then <varname>Col</varname> is sparse
+                        as well.
+                    </para>
                 </listitem>
             </varlistentry>
             <varlistentry>
-                <term>A1,...,An</term>
+                <term>Row</term>
                 <listitem>
-                    <para>a set of real vectors or matrices, all of the same size or
-                        scalar
+                    <para>
+                        row vector if <varname>A</varname> is a 2D matrix, or hypermatrix of
+                        size(A) with size(A,1) set to 1: Maxima over rows (for each column).
+                        If <varname>A</varname> is sparse, then <varname>Row</varname> is sparse
+                        as well.
+                    </para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>M</term>
+                <listitem>
+                    <para>
+                        Array of size = <literal>size(A1)</literal>, such that for any q
+                        <literal>M(q) = max(A1(q),A2(q),..An(q))</literal>
+                        If <varname>A</varname>,..,<varname>An</varname> are sparse, then
+                        <varname>M</varname> is sparse as well.
+                    </para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>K</term>
+                <listitem>
+                    <para>
+                        Indices in <varname>A</varname>.. of the (first) maximum found.
+                        When <literal>[m,K]=max(A)</literal> is used,
+                        <itemizedlist>
+                            <listitem>
+                                If <literal>A</literal> is a vector, K is a scalar.
+                            </listitem>
+                            <listitem>
+                                Otherwise, <varname>K</varname> is a row vector [i,j,..] of subscripts.
+                            </listitem>
+                        </itemizedlist>
+                    </para>
+                    <para>
+                        For other syntaxes, <varname>K</varname> has the shape and sizes of
+                        <varname>Col</varname>, <varname>Row</varname>, and <varname>M</varname>.
+                    </para>
+                    <para>
+                        With the <literal>[M,K] = max(A1,A2,..,An)</literal> syntax, we have,
+                        for any linear index q:
+                        <literal>[M(q),K(q)] = max([A1(q) A2(q) .. An(q)])</literal>.
+                    </para>
+                    <para>
+                        <warning>
+                            <varname>K</varname> is always in dense format, even when
+                            <varname>A, A1,..,An</varname> are sparse-encoded. Hence, when the
+                            <literal>[M,K]=max(A1,A2,..)</literal> syntax is used with huge but
+                            sparse matrices, this may lead to a huge <emphasis>dense</emphasis>
+                            <varname>K</varname> matrix. The user must check that enough memory
+                            is available for it.
+                        </warning>
                     </para>
                 </listitem>
             </varlistentry>
     <refsection>
         <title>Description</title>
         <para>
-            For <literal>A</literal>, a real vector or matrix,
-            <literal>max(A)</literal> is the largest element <literal>A</literal>.
-            <literal>[m,k]=max(A)</literal> gives in addition the index of the
-            maximum. A second argument of type string <literal>'r'</literal> or
-            <literal>'c'</literal> can be used : <literal>'r'</literal> is used to get
-            a row vector <literal>m</literal> such that <literal>m(j)</literal>
-            contains the maximum of the <literal>j</literal>th column of
-            <literal>A</literal> (<literal>A(:,j)</literal>), <literal>k(j)</literal>
-            gives the row indice which contain the maximum for column <literal>j</literal>.
-            <literal>'c'</literal> is used for the dual operation on the rows of
-            <literal>A</literal>. <literal>'m'</literal> is used for compatibility
-            with Matlab.
+            For <literal>A</literal>, a real vector or matrix, <literal>max(A)</literal> is the
+            greatest element of <literal>A</literal>.
         </para>
         <para>
-            <literal>m=max(A1,A2,...,An)</literal>, where all the
-            <literal>Aj</literal> are matrices of the same sizes, returns a vector or a
-            matrix <literal>m</literal> of size <literal>size(m)=size(A1)</literal>
-            such that <literal>m(i)= max( Aj(i)), j=1,...,n</literal>.
-            <literal>[m,k]=max(A1,A2,...,An)</literal> gives in addition the vector or
-            matrix <literal>k</literal>. For a fixed <literal>i</literal>,
-            <literal>k(i)</literal> is the number of the first
-            <literal>Aj(i)</literal> achieving the maximum.
+            <literal>[m,K]=max(A)</literal> gives in addition the indices of the first maximum.
         </para>
         <para>
-            <literal>[m,k]=max(list(A1,...,An))</literal> is an equivalent
-            syntax of <literal>[m,k]=max(A1,A2,...,An)</literal>.
+            A second argument of type string <literal>'r'</literal> or
+            <literal>'c'</literal> can be used : <literal>'r'</literal> is used to get
+            a row vector <literal>Row</literal> such that <literal>Row(j)</literal>
+            contains the maximum of the <literal>j</literal>th column <literal>A(:,j)</literal>,
+            <literal>K(j)</literal> gives the index of the row
+            which contains the maximum, for the column #<literal>j</literal>.
         </para>
-    </refsection>
-    <refsection>
-        <title>Remark</title>
         <para>
-            <note>
-                This function ignores terms of <varname>A</varname> which are NANs.
-            </note>
+            <literal>'c'</literal> is used for the dual operation on the rows of
+            <literal>A</literal>. <literal>'m'</literal> is used for compatibility with Matlab.
         </para>
+        <para>
+            <literal>[M,K]=max(list(A1,...,An))</literal> is an equivalent
+            syntax of <literal>[M,K]=max(A1,A2,...,An)</literal>.
+        </para>
+        <note>
+            <itemizedlist>
+                <listitem>
+                    max() ignores NaN values (unless there are only NaN values).
+                </listitem>
+                <listitem>
+                    <literal>max([])</literal> returns
+                    <literal>[]</literal> for values and <varname>K</varname>.
+                </listitem>
+            </itemizedlist>
+        </note>
     </refsection>
     <refsection>
         <title>Examples</title>
         <programlisting role="example"><![CDATA[
-[m,n]=max([1,3,1])
-[m,n]=max([3,1,1],[1,3,1],[1,1,3])
-[m,n]=max([3,-2,1],1)
-[m,n]=max(list([3,1,1],[1,3,1],[1,1,3]))
-[m,n]=max(list(1,3,1))
+[m, k] = max([])
+[m, k] = max([1 5 ; 3 %nan])
+[m, k] = max([1 5 ; 3 %nan], 2.5)
+[m, k] = max([5 -1 1], [1 0 3], [2 1 3])
+[m, k] = max(list([5 -1 1], [1 0 3], [2 1 3]))
+ ]]></programlisting>
+    <screen><![CDATA[
+--> [m, k] = max([])
+ m  =
+    []
+ k  =
+    []
+
+--> [m, k] = max([1 5 ; 3 %nan])
+ m  =
+   5.
+
+ k  =
+   1.   2.
+
+--> [m, k] = max([1 5 ; 3 %nan], 2.5)
+ m  =
+   2.5   5.
+   3.    2.5
+
+ k  =
+   2.   1.
+   1.   2.
+
+--> [m, k] = max([5 -1 1], [1 0 3], [2 1 3])
+ m  =
+   5.   1.   3.
+
+ k  =
+   1.   3.   2.
+]]></screen>
+        <para>
+            <emphasis role="bold">With the "r" or "c" options</emphasis>:
+        </para>
+        <programlisting role="example"><![CDATA[
+A = grand(4,6,"uin",0,30); A(3,4) = %nan
+[Row, K] = max(A, "r")
+[Col, K] = max(A, "c")
  ]]></programlisting>
+    <screen><![CDATA[
+--> A = grand(4,6,"uin",0,30); A(3,4) = %nan
+ A  =
+   18.   3.    22.   0.    13.   28.
+   16.   20.   25.   6.    10.   1.
+   25.   26.   20.   Nan   2.    21.
+   5.    9.    16.   15.   24.   25.
+
+--> [Row, K] = max(A, "r")
+ Row  =
+   25.   26.   25.   15.   24.   28.
+
+ K  =
+   3.   3.   2.   4.   4.   1.
+
+--> [Col, K] = max(A, "c")
+ Col  =
+   28.
+   25.
+   26.
+   25.
+
+ K  =
+   6.
+   3.
+   2.
+   6.
+ ]]></screen>
+        <para>
+            <emphasis role="bold">With sparse inputs</emphasis>:
+        </para>
+        <programlisting role="example"><![CDATA[
+s = sprand(5,4,0.5); k = s~=0; s(k) = round((s(k)-0.5)*10), full(s)
+[Row, K] = max(s, "r")
+[Col, K] = max(s, "c")
+[M, K] = max(s, -1);   [full(s)  ones(s(:,1))*%nan  full(M)]
+issparse(M)
+K
+ ]]></programlisting>
+    <screen><![CDATA[
+--> s = sprand(5,4,0.5); k = s~=0; s(k) = round((s(k)-0.5)*10), full(s)
+ s  =
+(  5,  4) sparse matrix
+(  1,  2)    -2.
+(  1,  3)    -4.
+(  1,  4)     3.
+(  2,  1)    -5.
+(  2,  4)     3.
+(  3,  2)    -2.
+(  3,  3)    -4.
+(  4,  2)     4.
+(  4,  4)     2.
+(  5,  2)    -5.
+(  5,  3)     5.
+(  5,  4)    -4.
+
+ ans  =
+   0.  -2.  -4.   3.
+  -5.   0.   0.   3.
+   0.  -2.  -4.   0.
+   0.   4.   0.   2.
+   0.  -5.   5.  -4.
+
+--> [Row, K] = max(s, "r")
+ Row  =
+(  1,  4) sparse matrix
+(  1,  2)     4.
+(  1,  3)     5.
+(  1,  4)     3.
+
+ K  =
+   1.   4.   5.   1.
+
+--> [Col, K] = max(s, "c")
+ Col  =
+(  5,  1) sparse matrix
+(  1,  1)     3.
+(  2,  1)     3.
+(  4,  1)     4.
+(  5,  1)     5.
+
+ K  =
+   4.
+   4.
+   1.
+   2.
+   3.
+
+--> [M, K] = max(s, -1);   [full(s)  ones(s(:,1))*%nan  full(M)]
+ ans  =
+   0.  -2.  -4.   3.   Nan   0.  -1.  -1.   3.
+  -5.   0.   0.   3.   Nan  -1.   0.   0.   3.
+   0.  -2.  -4.   0.   Nan   0.  -1.  -1.   0.
+   0.   4.   0.   2.   Nan   0.   4.   0.   2.
+   0.  -5.   5.  -4.   Nan   0.  -1.   5.  -1.
+
+--> issparse(M)
+ ans  =
+   1.
+
+--> K
+ K  =
+   1.   2.   2.   1.
+   2.   1.   1.   1.
+   1.   2.   2.   1.
+   1.   1.   1.   1.
+   1.   2.   1.   2.
+]]> </screen>
     </refsection>
     <refsection role="see also">
         <title>See also</title>
         <simplelist type="inline">
             <member>
+                <link linkend="min">min</link>
+            </member>
+            <member>
+                <link linkend="strange">strange</link>
+            </member>
+            <member>
+                <link linkend="mean">mean</link>
+            </member>
+            <member>
                 <link linkend="gsort">gsort</link>
             </member>
             <member>
                 <link linkend="find">find</link>
             </member>
             <member>
-                <link linkend="min">min</link>
+                <link linkend="full">full</link>
             </member>
         </simplelist>
     </refsection>
+    <refsection role="history">
+        <title>History</title>
+        <revhistory>
+            <revision>
+                <revnumber>6.0.2</revnumber>
+                <revdescription>
+                    max() now actually works with sparse matrices
+                </revdescription>
+            </revision>
+        </revhistory>
+    </refsection>
 </refentry>
index de30644..da933b6 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) 2018 - 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="min" 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="min" xml:lang="en">
     <refnamediv>
         <refname>min</refname>
         <refpurpose>minimum</refpurpose>
     </refnamediv>
     <refsynopsisdiv>
         <title>Syntax</title>
-        <synopsis>[m [,k]]=min(A)
-            [m [,k]]=min(A,'c')
-            [m [,k]]=min(A,'r')
-            [m [,k]]=min(A,'m')
-            [m [,k]]=min(A1,A2,...,An)
-            [m [,k]]=min(list(A1,A2,...,An))
+        <synopsis>
+            m = min(A)
+            Col = min(A, 'c')
+            Row = min(A, 'r'|'m')
+            M = min(A1, A2,..., An)
+            M = min(list(A1, A2,..., An))
+            [.., K] = min(..)
         </synopsis>
     </refsynopsisdiv>
     <refsection>
         <title>Arguments</title>
         <variablelist>
             <varlistentry>
-                <term>A</term>
+                <term>A, A1, ..., An</term>
+                <listitem>
+                    <para>
+                        scalars, vectors, matrices or hypermatrices of encoded integers or of real
+                        numbers, in dense or sparse format. They must have the same sizes, or be
+                        mixed with scalars (scalars are then implicitly expanded to the arrays sizes).
+                        Sparse arrays can't be mixed with dense ones, except with dense
+                        <emphasis>positive</emphasis> scalars.
+                    </para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>m</term>
+                <listitem>
+                    <para>
+                        single number = minimum of all values of <varname>A</varname> elements.
+                        Always in dense format, even when <varname>A</varname> is sparse encoded.
+                    </para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>Col</term>
                 <listitem>
-                    <para>real vector or matrix.</para>
+                    <para>
+                        column vector if <varname>A</varname> is a 2D matrix, or hypermatrix of
+                        size(A) with size(A,2) set to 1: Minima over columns (for each row).
+                        If <varname>A</varname> is sparse, then <varname>Col</varname> is sparse
+                        as well.
+                    </para>
                 </listitem>
             </varlistentry>
             <varlistentry>
-                <term>A1,...,An</term>
+                <term>Row</term>
                 <listitem>
-                    <para>a set of real vectors or matrices, all of the same size or
-                        scalar.
+                    <para>
+                        row vector if <varname>A</varname> is a 2D matrix, or hypermatrix of
+                        size(A) with size(A,1) set to 1: Minima over rows (for each column).
+                        If <varname>A</varname> is sparse, then <varname>Row</varname> is sparse
+                        as well.
+                    </para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>M</term>
+                <listitem>
+                    <para>
+                        Array of size = <literal>size(A1)</literal>, such that for any q
+                        <literal>M(q) = min(A1(q),A2(q),..An(q))</literal>
+                        If <varname>A</varname>,..,<varname>An</varname> are sparse, then
+                        <varname>M</varname> is sparse as well.
+                    </para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>K</term>
+                <listitem>
+                    <para>
+                        Indices in <varname>A</varname>.. of the (first) minimum found.
+                        When <literal>[m,K]=min(A)</literal> is used,
+                        <itemizedlist>
+                            <listitem>
+                                If <literal>A</literal> is a vector, K is a scalar.
+                            </listitem>
+                            <listitem>
+                                Otherwise, <varname>K</varname> is a row vector [i,j,..] of subscripts.
+                            </listitem>
+                        </itemizedlist>
+                    </para>
+                    <para>
+                        For other syntaxes, <varname>K</varname> has the shape and sizes of
+                        <varname>Col</varname>, <varname>Row</varname>, and <varname>M</varname>.
+                    </para>
+                    <para>
+                        With the <literal>[M,K] = min(A1,A2,..,An)</literal> syntax, we have,
+                        for any linear index q:
+                        <literal>[M(q),K(q)] = min([A1(q) A2(q) .. An(q)])</literal>.
+                    </para>
+                    <para>
+                        <warning>
+                            <varname>K</varname> is always in dense format, even when
+                            <varname>A, A1,..,An</varname> are sparse-encoded. Hence, when the
+                            <literal>[M,K]=min(A1,A2,..)</literal> syntax is used with huge but
+                            sparse matrices, this may lead to a huge <emphasis>dense</emphasis>
+                            <varname>K</varname> matrix. The user must check that enough memory
+                            is available for it.
+                        </warning>
                     </para>
                 </listitem>
             </varlistentry>
     <refsection>
         <title>Description</title>
         <para>
-            For <literal>A</literal>, a real vector or matrix,
-            <literal>min(A)</literal> is the least element <literal>A</literal>.
-            <literal>[m,k]=min(A)</literal> gives in addition the index of the
-            minimum. A second argument of type string <literal>'r'</literal> or
-            <literal>'c'</literal> can be used : <literal>'r'</literal> is used to get
-            a row vector <literal>m</literal> such that <literal>m(j)</literal>
-            contains the minimum of the <literal>j</literal>th column of <literal>A</literal>
-            (<literal>A(:,j)</literal>), <literal>k(j)</literal> gives the row indice
-            which contain the minimum for column <literal>j</literal>.
-            <literal>'c'</literal> is used for the dual operation on the rows of
-            <literal>A</literal>. <literal>'m'</literal> is used for compatibility
-            with Matlab.
+            For <literal>A</literal>, a real vector or matrix, <literal>min(A)</literal> is the
+            least element of <literal>A</literal>.
         </para>
         <para>
-            <literal>m=min(A1,A2,...,An)</literal>, where all the
-            <literal>Aj</literal> are matrices of the same sizes, returns a vector or a
-            matrix <literal>m</literal> of size <literal>size(m)=size(A1)</literal>
-            such that <literal>m(i)= min( Aj(i)), j=1,...,n</literal>.
-            <literal>[m,k]=min(A1,A2,...,An)</literal> gives in addition the vector or
-            matrix <literal>k</literal>. For a fixed <literal>i</literal>,
-            <literal>k(i)</literal> is the number of the first
-            <literal>Aj(i)</literal> achieving the minimum.
+            <literal>[m,K]=min(A)</literal> gives in addition the indices of the first minimum.
         </para>
         <para>
-            <literal>[m,k]=min(list(A1,...,An))</literal> is an equivalent
-            syntax of <literal>[m,k]=min(A1,A2,...,An)</literal>.
+            A second argument of type string <literal>'r'</literal> or
+            <literal>'c'</literal> can be used : <literal>'r'</literal> is used to get
+            a row vector <literal>Row</literal> such that <literal>Row(j)</literal>
+            contains the minimum of the <literal>j</literal>th column <literal>A(:,j)</literal>,
+            <literal>K(j)</literal> gives the index of the row
+            which contains the minimum, for the column #<literal>j</literal>.
         </para>
-    </refsection>
-    <refsection>
-        <title>Remark</title>
         <para>
-            <note>
-                This function ignores terms of <varname>A</varname> which are NANs.
-            </note>
+            <literal>'c'</literal> is used for the dual operation on the rows of
+            <literal>A</literal>. <literal>'m'</literal> is used for compatibility with Matlab.
         </para>
+        <para>
+            <literal>[M,K]=min(list(A1,...,An))</literal> is an equivalent
+            syntax of <literal>[M,K]=min(A1,A2,...,An)</literal>.
+        </para>
+        <note>
+            <itemizedlist>
+                <listitem>
+                    min() ignores NaN values (unless there are only NaN values).
+                </listitem>
+                <listitem>
+                    <literal>min([])</literal> returns
+                    <literal>[]</literal> for values and <varname>K</varname>.
+                </listitem>
+            </itemizedlist>
+        </note>
     </refsection>
     <refsection>
         <title>Examples</title>
         <programlisting role="example"><![CDATA[
-[m,n]=min([1,3,1])
-[m,n]=min([3,1,1],[1,3,1],[1,1,3])
-[m,n]=min([3,-2,1],1)
-[m,n]=min(list([3,1,1],[1,3,1],[1,1,3]))
-[m,n]=min(list(1,3,1))
+[m, k] = min([])
+[m, k] = min([5 3 ; 2 %nan])
+[m, n] = min([5 3 ; 2 %nan], 4)
+[m, k] = min([5 -1 2], [1 5 1], [0 1 3])
+[m, k] = min(list([5 -1 2], [1 5 1], [0 1 3]))
+ ]]></programlisting>
+    <screen><![CDATA[
+--> [m, k] = min([])
+ m  =
+    []
+ k  =
+    []
+
+--> [m, k] = min([5 3 ; 2 %nan])
+ m  =
+   2.
+
+ k  =
+   2.   1.
+
+--> [m, k] = min([5 3 ; 2 %nan], 4)
+ m  =
+   4.   3.
+   2.   4.
+
+ k  =
+   2.   1.
+   1.   2.
+
+--> [m, k] = min([5 -1 2], [1 5 1], [0 1 3])
+ m  =
+   0.  -1.   1.
+
+ k  =
+   3.   1.   2.
+]]></screen>
+        <para>
+            <emphasis role="bold">With the "r" or "c" options</emphasis>:
+        </para>
+        <programlisting role="example"><![CDATA[
+A = grand(4,6,"uin",0,30); A(3,4) = %nan
+[Row, K] = min(A, "r")
+[Col, K] = min(A, "c")
  ]]></programlisting>
+    <screen><![CDATA[
+--> A = grand(4,6,"uin",0,30); A(3,4) = %nan
+ A  =
+   24.   14.   24.   4.    6.    11.
+   23.   25.   29.   6.    19.   5.
+   30.   2.    20.   Nan    6.   6.
+   20.   8.    13.   14.   16.   3.
+
+--> [Row, K] = min(A, "r")
+ Row  =
+   20.   2.   13.   4.   6.   3.
+
+ K  =
+   4.   3.   4.   1.   1.   4.
+
+--> [Col, K] = min(A, "c")
+ Col  =
+   4.
+   5.
+   2.
+   3.
+
+ K  =
+   4.
+   6.
+   2.
+   6.
+ ]]></screen>
+        <para>
+            <emphasis role="bold">With sparse inputs</emphasis>:
+        </para>
+        <programlisting role="example"><![CDATA[
+s = sprand(5,4,0.5); k = s~=0; s(k) = round((s(k)-0.5)*10), full(s)
+[Row, K] = min(s, "r")
+[Col, K] = min(s, "c")
+[M, K] = min(s,1);   [full(s)  ones(s(:,1))*%nan  full(M)]
+issparse(M)
+K
+ ]]></programlisting>
+    <screen><![CDATA[
+--> s = sprand(5,4,0.5); k = s~=0; s(k) = round((s(k)-0.5)*10), full(s)
+ s  =
+(  5,  4) sparse matrix
+(  1,  3)     5.
+(  1,  4)    -2.
+(  2,  1)    -3.
+(  2,  3)    -5.
+(  3,  1)     3.
+(  3,  2)    -1.
+(  3,  3)     3.
+(  3,  4)     4.
+(  5,  3)     4.
+(  5,  4)    -5.
+
+ ans  =
+   0.   0.   5.  -2.
+  -3.   0.  -5.   0.
+   3.  -1.   3.   4.
+   0.   0.   0.   0.
+   0.   0.   4.  -5.
+
+
+--> [Row, K] = min(s, "r")
+ Row  =
+(  1,  4) sparse matrix
+(  1,  1)    -3.
+(  1,  2)    -1.
+(  1,  3)    -5.
+(  1,  4)    -5.
+
+ K  =
+   2.   3.   2.   5.
+
+--> [Col, K] = min(s, "c")
+ Col  =
+(  5,  1) sparse matrix
+(  1,  1)    -2.
+(  2,  1)    -5.
+(  3,  1)    -1.
+(  5,  1)    -5.
+
+ K  =
+   4.
+   3.
+   2.
+   1.
+   4.
+
+--> [M, K] = min(s,1);   [full(s)  ones(s(:,1))*%nan  full(M)]
+ ans  =
+   0.   0.   5.  -2.   Nan   0.   0.   1.  -2.
+  -3.   0.  -5.   0.   Nan  -3.   0.  -5.   0.
+   3.  -1.   3.   4.   Nan   1.  -1.   1.   1.
+   0.   0.   0.   0.   Nan   0.   0.   0.   0.
+   0.   0.   4.  -5.   Nan   0.   0.   1.  -5.
+
+--> issparse(M)
+ ans  =
+   1.
+
+--> K
+ K  =
+   1.   1.   2.   1.
+   1.   1.   1.   1.
+   2.   1.   2.   2.
+   1.   1.   1.   1.
+   1.   1.   2.   1.
+]]> </screen>
     </refsection>
     <refsection role="see also">
         <title>See also</title>
         <simplelist type="inline">
             <member>
+                <link linkend="max">max</link>
+            </member>
+            <member>
+                <link linkend="strange">strange</link>
+            </member>
+            <member>
+                <link linkend="mean">mean</link>
+            </member>
+            <member>
                 <link linkend="gsort">gsort</link>
             </member>
             <member>
                 <link linkend="find">find</link>
             </member>
             <member>
-                <link linkend="max">max</link>
+                <link linkend="full">full</link>
             </member>
         </simplelist>
     </refsection>
+    <refsection role="history">
+        <title>History</title>
+        <revhistory>
+            <revision>
+                <revnumber>6.0.2</revnumber>
+                <revdescription>
+                    min() now actually works with sparse matrices
+                </revdescription>
+            </revision>
+        </revhistory>
+    </refsection>
 </refentry>
diff --git a/scilab/modules/elementary_functions/help/fr_FR/matrixoperations/max.xml b/scilab/modules/elementary_functions/help/fr_FR/matrixoperations/max.xml
deleted file mode 100644 (file)
index 47d491d..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-<?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="max" xml:lang="fr">
-    <refnamediv>
-        <refname>max</refname>
-        <refpurpose>maximum</refpurpose>
-    </refnamediv>
-    <refsynopsisdiv>
-        <title>Séquence d'appel</title>
-        <synopsis>[m [,k]]=max(A)
-            [m [,k]]=max(A,'c')
-            [m [,k]]=max(A,'r')
-            [m [,k]]=max(A,'m')
-            [m [,k]]=max(A1,A2,...,An)
-            [m [,k]]=max(list(A1,A2,...,An))
-        </synopsis>
-    </refsynopsisdiv>
-    <refsection>
-        <title>Paramètres</title>
-        <variablelist>
-            <varlistentry>
-                <term>A</term>
-                <listitem>
-                    <para>vecteur ou matrice réelle.</para>
-                </listitem>
-            </varlistentry>
-            <varlistentry>
-                <term>A1,...,An</term>
-                <listitem>
-                    <para>un ensemble de vecteurs ou de matrices toutes de même
-                        taille.
-                    </para>
-                </listitem>
-            </varlistentry>
-        </variablelist>
-    </refsection>
-    <refsection>
-        <title>Description</title>
-        <para>
-            Pour <literal>A</literal>, un vecteur ou une matrice réelle,
-            <literal>max(A)</literal> est son plus grand élément.
-            <literal>[m,k]=max(A)</literal> donne la position du maximum dans
-            <literal>A</literal>. Le deuxième argument peut être la chaîne de
-            caractère <literal>'r'</literal> ou <literal>'c'</literal> :
-            <literal>'r'</literal> permet d'obtenir un vecteur ligne
-            <literal>m</literal> tel que <literal>m(j)</literal> contient le maximum
-            de la<literal>j</literal>-ième colonne de A (<literal>A(:,j)</literal>),
-            <literal>k(j)</literal> donne le numéro de la ligne qui contient le
-            maximum pour la colonne <literal>j</literal>. <literal>'c'</literal> est
-            utilisé pour l'opération duale sur les lignes de <literal>A</literal>.
-            <literal>'m'</literal> est utilisé pour la compatibilité avec
-            Mtalab.
-        </para>
-        <para>
-            <literal>m=max(A1,A2,...,An)</literal>, où tous les
-            <literal>Aj</literal> sont des matrices de même taille, renvoie un vecteur
-            ou une matrice <literal>m</literal> de taille
-            <literal>size(m)=size(A1)</literal> telle que <literal>m(i)= max( Aj(i)),
-                j=1,...,n
-            </literal>
-            .<literal>[m,k]=max(A1,A2,...,An)</literal> donne de
-            plus le vecteur ou la matrice <literal>k</literal>. Pour un
-            <literal>i</literal> donné, <literal>k(i)</literal> est le numéro de la
-            première <literal>Aj(i)</literal> réalisant le maximum.
-        </para>
-        <para>
-            <literal>[m,k]=max(list(A1,...,An))</literal> est une syntaxe
-            équivalente de <literal>[m,k]=max(A1,A2,...,An)</literal>
-        </para>
-    </refsection>
-    <refsection>
-        <title>Remarque</title>
-        <para>
-            <note>
-                La fonction ignore les termes de <varname>A</varname> qui sont des NANs.
-            </note>
-        </para>
-    </refsection>
-    <refsection>
-        <title>Exemples</title>
-        <programlisting role="example"><![CDATA[
-[m,n]=max([1,3,1])
-[m,n]=max([3,1,1],[1,3,1],[1,1,3])
-[m,n]=max([3,-2,1],1)
-[m,n]=max(list([3,1,1],[1,3,1],[1,1,3]))
-[m,n]=max(list(1,3,1))
- ]]></programlisting>
-    </refsection>
-    <refsection role="see also">
-        <title>Voir aussi</title>
-        <simplelist type="inline">
-            <member>
-                <link linkend="gsort">gsort</link>
-            </member>
-            <member>
-                <link linkend="find">find</link>
-            </member>
-            <member>
-                <link linkend="max">max</link>
-            </member>
-        </simplelist>
-    </refsection>
-</refentry>
diff --git a/scilab/modules/elementary_functions/help/fr_FR/matrixoperations/min.xml b/scilab/modules/elementary_functions/help/fr_FR/matrixoperations/min.xml
deleted file mode 100644 (file)
index 35cc48a..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-<?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="min" xml:lang="fr">
-    <refnamediv>
-        <refname>min</refname>
-        <refpurpose>minimum</refpurpose>
-    </refnamediv>
-    <refsynopsisdiv>
-        <title>Séquence d'appel</title>
-        <synopsis>[m [,k]]=min(A)
-            [m [,k]]=min(A,'c')
-            [m [,k]]=min(A,'r')
-            [m [,k]]=min(A,'m')
-            [m [,k]]=min(A1,A2,...,An)
-            [m [,k]]=min(list(A1,A2,...,An))
-        </synopsis>
-    </refsynopsisdiv>
-    <refsection>
-        <title>Paramètres</title>
-        <variablelist>
-            <varlistentry>
-                <term>A</term>
-                <listitem>
-                    <para>vecteur ou matrice réelle.</para>
-                </listitem>
-            </varlistentry>
-            <varlistentry>
-                <term>A1,...,An</term>
-                <listitem>
-                    <para>un ensemble de vecteurs ou de matrices toutes de même
-                        taille.
-                    </para>
-                </listitem>
-            </varlistentry>
-        </variablelist>
-    </refsection>
-    <refsection>
-        <title>Description</title>
-        <para>
-            Pour <literal>A</literal>, un vecteur ou une matrice réelle,
-            <literal>min(A)</literal> est son plus petit élément.
-            <literal>[m,k]=min(A)</literal> donne la position du minimum dans
-            <literal>A</literal>. Le deuxième argument peut être la chaîne de
-            caractère <literal>'r'</literal> ou <literal>'c'</literal> :
-            <literal>'r'</literal> permet d'obtenir un vecteur ligne
-            <literal>m</literal> tel que <literal>m(j)</literal> contient le minimum
-            de la<literal>j</literal>-ième colonne de A (<literal>A(:,j)</literal>),
-            <literal>k(j)</literal> donne le numéro de la ligne qui contient le
-            minimum pour la colonne <literal>j</literal>. <literal>'c'</literal> est
-            utilisé pour l'opération duale sur les lignes de <literal>A</literal>.
-            <literal>'m'</literal> est utilisé pour la compatibilité avec
-            Matlab.
-        </para>
-        <para>
-            <literal>m=min(A1,A2,...,An)</literal>, où tous les
-            <literal>Aj</literal> sont des matrices de même taille, renvoie un vecteur
-            ou une matrice <literal>m</literal> de taille
-            <literal>size(m)=size(A1)</literal> telle que <literal>m(i)= min( Aj(i)),
-                j=1,...,n
-            </literal>
-            .<literal>[m,k]=min(A1,A2,...,An)</literal> donne de
-            plus le vecteur ou la matrice <literal>k</literal>. Pour un
-            <literal>i</literal> donné, <literal>k(i)</literal> est le numéro de la
-            première <literal>Aj(i)</literal> réalisant le minimum.
-        </para>
-        <para>
-            <literal>[m,k]=min(list(A1,...,An))</literal> est une syntaxe
-            équivalente de <literal>[m,k]=min(A1,A2,...,An)</literal>
-        </para>
-    </refsection>
-    <refsection>
-        <title>Remarque</title>
-        <para>
-            <note>
-                La fonction ignore les termes de <varname>A</varname> qui sont des NANs.
-            </note>
-        </para>
-    </refsection>
-    <refsection>
-        <title>Exemples</title>
-        <programlisting role="example"><![CDATA[
-[m,n]=min([1,3,1])
-[m,n]=min([3,1,1],[1,3,1],[1,1,3])
-[m,n]=min([3,-2,1],1)
-[m,n]=min(list([3,1,1],[1,3,1],[1,1,3]))
-[m,n]=min(list(1,3,1))
- ]]></programlisting>
-    </refsection>
-    <refsection role="see also">
-        <title>Voir aussi</title>
-        <simplelist type="inline">
-            <member>
-                <link linkend="gsort">gsort</link>
-            </member>
-            <member>
-                <link linkend="find">find</link>
-            </member>
-            <member>
-                <link linkend="max">max</link>
-            </member>
-        </simplelist>
-    </refsection>
-</refentry>
diff --git a/scilab/modules/elementary_functions/help/ja_JP/matrixoperations/max.xml b/scilab/modules/elementary_functions/help/ja_JP/matrixoperations/max.xml
deleted file mode 100644 (file)
index 9ed7cc9..0000000
+++ /dev/null
@@ -1,207 +0,0 @@
-<?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
- *
- * 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="max" xml:lang="ja">
-
-    <refnamediv>
-
-        <refname>max</refname>
-
-        <refpurpose>最大値</refpurpose>
-
-    </refnamediv>
-
-    <refsynopsisdiv>
-
-        <title>呼び出し手順</title>
-
-        <synopsis>[m [,k]]=max(A)
-
-            [m [,k]]=max(A,'c')
-
-            [m [,k]]=max(A,'r')
-
-            [m [,k]]=max(A,'m')
-
-            [m [,k]]=max(A1,A2,...,An)
-
-            [m [,k]]=max(list(A1,A2,...,An))
-
-        </synopsis>
-
-    </refsynopsisdiv>
-
-    <refsection>
-
-        <title>引数</title>
-
-        <variablelist>
-
-            <varlistentry>
-
-                <term>A</term>
-
-                <listitem>
-
-                    <para>実数のベクトルまたは行列.</para>
-
-                </listitem>
-
-            </varlistentry>
-
-            <varlistentry>
-
-                <term>A1,...,An</term>
-
-                <listitem>
-
-                    <para>実数ベクトルまたは行列の集合, 全ての同じ大きさまたはスカラー.</para>
-
-                </listitem>
-
-            </varlistentry>
-
-        </variablelist>
-
-    </refsection>
-
-    <refsection>
-
-        <title>説明</title>
-
-        <para>
-
-            <literal>A</literal>が実数のベクトルまたは行列の場合,
-
-            <literal>max(A)</literal>は<literal>A</literal>の最大要素となります.
-
-            <literal>[m,k]=max(A)</literal> は,オプションで最大値の添え字も出力します.
-
-            文字列型の2番目の引数に<literal>'r'</literal> または
-
-            <literal>'c'</literal>を指定できます:
-
-            <literal>'r'</literal>は<literal>m(j)</literal>が
-
-            Aの<literal>j</literal>番目の列(<literal>A(:,j)</literal>)の最大値となる
-
-            行ベクトル<literal>m</literal>および
-
-            <literal>k(j)</literal>が列<literal>j</literal>の最大値を
-
-            含む添え字を取得するために使用されます.
-
-            <literal>'c'</literal> は<literal>A</literal>の行でこの二つの処理を
-
-            行うために使用されます.
-
-            <literal>'m'</literal> は Matlabとの互換性維持のために使用されます.
-
-        </para>
-
-        <para>
-
-            <literal>m=max(A1,A2,...,An)</literal>, ただし,
-
-            <literal>Aj</literal>は全て同じ大きさの行列で,
-
-            <literal>m(i)= max( Aj(i)), j=1,...,n</literal>とする時,
-
-            大きさ <literal>size(m)=size(A1)</literal>となる
-
-            ベクトルまたは行列 <literal>m</literal> を返します.
-
-            <literal>[m,k]=max(A1,A2,...,An)</literal> は加えてベクトルまたは行列
-
-            <literal>k</literal>も返します.
-
-            ある<literal>i</literal>について,<literal>k(i)</literal>は
-
-            最大値となる最初の<literal>Aj(i)</literal>の番号です.
-
-        </para>
-
-        <para>
-
-            <literal>[m,k]=max(list(A1,...,An))</literal> は
-
-            <literal>[m,k]=max(A1,A2,...,An)</literal>と等価な構文です.
-
-        </para>
-
-    </refsection>
-
-    <refsection>
-
-        <title>注意</title>
-
-        <para>
-
-            <note>
-
-                この関数は<varname>A</varname>に含まれる項がNaNの場合に無視します.
-
-            </note>
-
-        </para>
-
-    </refsection>
-
-    <refsection>
-
-        <title>例</title>
-
-        <programlisting role="example"><![CDATA[
-[m,n]=max([1,3,1])
-[m,n]=max([3,1,1],[1,3,1],[1,1,3])
-[m,n]=max([3,-2,1],1)
-[m,n]=max(list([3,1,1],[1,3,1],[1,1,3]))
-[m,n]=max(list(1,3,1))
- ]]></programlisting>
-
-    </refsection>
-
-    <refsection role="see also">
-
-        <title>参照</title>
-
-        <simplelist type="inline">
-
-            <member>
-
-                <link linkend="gsort">gsort</link>
-
-            </member>
-
-            <member>
-
-                <link linkend="find">find</link>
-
-            </member>
-
-            <member>
-
-                <link linkend="min">min</link>
-
-            </member>
-
-        </simplelist>
-
-    </refsection>
-
-</refentry>
-
diff --git a/scilab/modules/elementary_functions/help/ja_JP/matrixoperations/min.xml b/scilab/modules/elementary_functions/help/ja_JP/matrixoperations/min.xml
deleted file mode 100644 (file)
index a5dcaf1..0000000
+++ /dev/null
@@ -1,207 +0,0 @@
-<?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
- *
- * 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="min" xml:lang="ja">
-
-    <refnamediv>
-
-        <refname>min</refname>
-
-        <refpurpose>最小値</refpurpose>
-
-    </refnamediv>
-
-    <refsynopsisdiv>
-
-        <title>呼出し手順</title>
-
-        <synopsis>[m [,k]]=min(A)
-
-            [m [,k]]=min(A,'c')
-
-            [m [,k]]=min(A,'r')
-
-            [m [,k]]=min(A,'m')
-
-            [m [,k]]=min(A1,A2,...,An)
-
-            [m [,k]]=min(list(A1,A2,...,An))
-
-        </synopsis>
-
-    </refsynopsisdiv>
-
-    <refsection>
-
-        <title>引数</title>
-
-        <variablelist>
-
-            <varlistentry>
-
-                <term>A</term>
-
-                <listitem>
-
-                    <para>実数ベクトルまたは行列.</para>
-
-                </listitem>
-
-            </varlistentry>
-
-            <varlistentry>
-
-                <term>A1,...,An</term>
-
-                <listitem>
-
-                    <para>実数ベクトルまたは行列の集合, 全て同じ大きさまたはスカラー.</para>
-
-                </listitem>
-
-            </varlistentry>
-
-        </variablelist>
-
-    </refsection>
-
-    <refsection>
-
-        <title>説明</title>
-
-        <para>
-
-            <literal>A</literal>が実数のベクトルまたは行列の場合,
-
-            <literal>min(A)</literal>は<literal>A</literal>の最小要素となります.
-
-            <literal>[m,k]=min(A)</literal> は,オプションで最小値の添え字も出力します.
-
-            文字列型の2番目の引数に<literal>'r'</literal> または
-
-            <literal>'c'</literal>を指定できます:
-
-            <literal>'r'</literal>は<literal>m(j)</literal>が
-
-            Aの<literal>j</literal>番目の列(<literal>A(:,j)</literal>)の最小値となる
-
-            行ベクトル<literal>m</literal>および
-
-            <literal>k(j)</literal>が列<literal>j</literal>の最小値を
-
-            含む添え字を取得するために使用されます.
-
-            <literal>'c'</literal> は<literal>A</literal>の行でこの二つの処理を
-
-            行うために使用されます.
-
-            <literal>'m'</literal> は Matlabとの互換性維持のために使用されます.
-
-        </para>
-
-        <para>
-
-            <literal>m=min(A1,A2,...,An)</literal>, ただし,
-
-            <literal>Aj</literal>は全て同じ大きさの行列で,
-
-            <literal>m(i)= min( Aj(i)), j=1,...,n</literal>とする時,
-
-            大きさ <literal>size(m)=size(A1)</literal>となる
-
-            ベクトルまたは行列 <literal>m</literal> を返します.
-
-            <literal>[m,k]=min(A1,A2,...,An)</literal> は加えてベクトルまたは行列
-
-            <literal>k</literal>も返します.
-
-            ある<literal>i</literal>について,<literal>k(i)</literal>は
-
-            最小値となる最初の<literal>Aj(i)</literal>の番号です.
-
-        </para>
-
-        <para>
-
-            <literal>[m,k]=min(list(A1,...,An))</literal> は
-
-            <literal>[m,k]=min(A1,A2,...,An)</literal>と等価な構文です.
-
-        </para>
-
-    </refsection>
-
-    <refsection>
-
-        <title>注意</title>
-
-        <para>
-
-            <note>
-
-                この関数は<varname>A</varname>に含まれる項がNaNの場合に無視します.
-
-            </note>
-
-        </para>
-
-    </refsection>
-
-    <refsection>
-
-        <title>例</title>
-
-        <programlisting role="example"><![CDATA[
-[m,n]=min([1,3,1])
-[m,n]=min([3,1,1],[1,3,1],[1,1,3])
-[m,n]=min([3,-2,1],1)
-[m,n]=min(list([3,1,1],[1,3,1],[1,1,3]))
-[m,n]=min(list(1,3,1))
- ]]></programlisting>
-
-    </refsection>
-
-    <refsection role="see also">
-
-        <title>参照</title>
-
-        <simplelist type="inline">
-
-            <member>
-
-                <link linkend="gsort">gsort</link>
-
-            </member>
-
-            <member>
-
-                <link linkend="find">find</link>
-
-            </member>
-
-            <member>
-
-                <link linkend="max">max</link>
-
-            </member>
-
-        </simplelist>
-
-    </refsection>
-
-</refentry>
-
diff --git a/scilab/modules/elementary_functions/help/pt_BR/matrixoperations/max.xml b/scilab/modules/elementary_functions/help/pt_BR/matrixoperations/max.xml
deleted file mode 100644 (file)
index 7e60827..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--
- * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- * Copyright (C) 2008 - INRIA
- *
- * Copyright (C) 2012 - 2016 - Scilab Enterprises
- *
- * 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: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="max" xml:lang="pt">
-    <refnamediv>
-        <refname>max</refname>
-        <refpurpose>máximo</refpurpose>
-    </refnamediv>
-    <refsynopsisdiv>
-        <title>Seqüência de Chamamento</title>
-        <synopsis>[m [,k]]=max(A)
-            [m [,k]]=max(A,'c')
-            [m [,k]]=max(A,'r')
-            [m [,k]]=max(A,'m')
-            [m [,k]]=max(A1,A2,...,An)
-            [m [,k]]=max(list(A1,A2,...,An))
-        </synopsis>
-    </refsynopsisdiv>
-    <refsection>
-        <title>Parâmetros</title>
-        <variablelist>
-            <varlistentry>
-                <term>A</term>
-                <listitem>
-                    <para>vetor ou matriz de reais </para>
-                </listitem>
-            </varlistentry>
-            <varlistentry>
-                <term>A1,...,An</term>
-                <listitem>
-                    <para>um conjunto de vetores ou matrizes, todos de tamanhos iguais,
-                        ou de escalares
-                    </para>
-                </listitem>
-            </varlistentry>
-        </variablelist>
-    </refsection>
-    <refsection>
-        <title>Descrição</title>
-        <para>
-            Para <literal>A</literal>, um vetor ou matriz de reais,
-            <literal>max(A)</literal> é o maior elemento de <literal>A</literal>.
-            <literal>[m,k]=max(A)</literal> fornece, ainda, o índice do máximo. Um
-            segundo argumento do tipo string <literal>'r'</literal> ou
-            <literal>'c'</literal> pode ser usado : <literal>'r'</literal> é usado
-            para obter um vetor-linha <literal>m</literal> tal que
-            <literal>m(j)</literal> contém o méximo da <literal>j</literal> -ésima
-            coluna de A (<literal>A(:,j)</literal>), <literal>k(j)</literal> fornece o
-            índice de linha que contém o máximo para a coluna <literal>j</literal>.
-            <literal>'c'</literal> é usado para a operação dual de linhas de
-            <literal>A</literal>. <literal>'m'</literal> é usado para compatibilidade
-            com Matlab.
-        </para>
-        <para>
-            <literal>m=max(A1,A2,...,An)</literal>, onde todos os
-            <literal>Aj</literal> são matrizes de mesmo tamanho, retorna um vetor ou
-            matriz <literal>m</literal> de tamanho <literal>size(m)=size(A1)</literal>
-            tal que <literal>m(i)= max( Aj(i)), j=1,...,n</literal>.
-            <literal>[m,k]=max(A1,A2,...,An)</literal> fornece, ainda, o vetor ou
-            matriz <literal>k</literal>. Fixado <literal>i</literal>,
-            <literal>k(i)</literal> é o número do primeiro Aj(i) a alcançar o
-            máximo.
-        </para>
-        <para>
-            <literal>[m,k]=max(list(A1,...,An))</literal> é uma outra sintaxe
-            para <literal>[m,k]=max(A1,A2,...,An)</literal>
-        </para>
-    </refsection>
-    <refsection>
-        <title>Exemplos</title>
-        <programlisting role="example"><![CDATA[
-[m,n]=max([1,3,1])
-[m,n]=max([3,1,1],[1,3,1],[1,1,3])
-[m,n]=max([3,-2,1],1)
-[m,n]=max(list([3,1,1],[1,3,1],[1,1,3]))
-[m,n]=max(list(1,3,1))
- ]]></programlisting>
-    </refsection>
-    <refsection role="see also">
-        <title>Ver Também</title>
-        <simplelist type="inline">
-            <member>
-                <link linkend="gsort">gsort</link>
-            </member>
-            <member>
-                <link linkend="find">find</link>
-            </member>
-        </simplelist>
-    </refsection>
-</refentry>
diff --git a/scilab/modules/elementary_functions/help/pt_BR/matrixoperations/min.xml b/scilab/modules/elementary_functions/help/pt_BR/matrixoperations/min.xml
deleted file mode 100644 (file)
index acc395f..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--
- * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- * Copyright (C) 2008 - INRIA
- *
- * Copyright (C) 2012 - 2016 - Scilab Enterprises
- *
- * 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: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="min" xml:lang="pt">
-    <refnamediv>
-        <refname>min</refname>
-        <refpurpose>mínimo</refpurpose>
-    </refnamediv>
-    <refsynopsisdiv>
-        <title>Seqüência de Chamamento</title>
-        <synopsis>[m [,k]]=min(A)
-            [m [,k]]=min(A,'c')
-            [m [,k]]=min(A,'r')
-            [m [,k]]=min(A,'m')
-            [m [,k]]=min(A1,A2,...,An)
-            [m [,k]]=min(list(A1,A2,...,An))
-        </synopsis>
-    </refsynopsisdiv>
-    <refsection>
-        <title>Parâmetros</title>
-        <variablelist>
-            <varlistentry>
-                <term>A</term>
-                <listitem>
-                    <para>vetor ou matriz de reais </para>
-                </listitem>
-            </varlistentry>
-            <varlistentry>
-                <term>A1,...,An</term>
-                <listitem>
-                    <para>um conjunto de vetores ou matrizes, todos de tamanhos iguais,
-                        ou de escalares
-                    </para>
-                </listitem>
-            </varlistentry>
-        </variablelist>
-    </refsection>
-    <refsection>
-        <title>Descrição</title>
-        <para>
-            Para <literal>A</literal>, um vetor ou matriz de reais,
-            <literal>min(A)</literal> é o menor elemento de <literal>A</literal>.
-            <literal>[m,k]=min(A)</literal> fornece, ainda, o índice do mínimo. Um
-            segundo argumento do tipo string <literal>'r'</literal> ou
-            <literal>'c'</literal> pode ser usado : <literal>'r'</literal> é usado
-            para obter um vetor linha <literal>m</literal> tal que
-            <literal>m(j)</literal> contém o mínimo da <literal>j</literal> -ésima
-            coluna de A (<literal>A(:,j)</literal>), <literal>k(j)</literal> fornece o
-            índice de linha que contém o mínimo para a coluna <literal>j</literal>.
-            <literal>'c'</literal> é usado para a operação dual de linhas de
-            <literal>A</literal>. <literal>'m'</literal> é usado para compatibilidade
-            com Matlab.
-        </para>
-        <para>
-            <literal>m=min(A1,A2,...,An)</literal>, onde todos os
-            <literal>Aj</literal> são matrizes de mesmo tamanho, retorna um vetor ou
-            matriz <literal>m</literal> de tamanho <literal>size(m)=size(A1)</literal>
-            tal que <literal>m(i)= min( Aj(i)), j=1,...,n</literal>.
-            <literal>[m,k]=min(A1,A2,...,An)</literal> fornece, ainda, o vetor ou
-            matriz <literal>k</literal>. Fixado um <literal>i</literal>,
-            <literal>k(i)</literal> é o número do primeiro <literal>Aj(i)</literal> a
-            alcançar o mínimo.
-        </para>
-        <para>
-            <literal>[m,k]=min(list(A1,...,An))</literal> é uma outra sintaxe
-            para <literal>[m,k]=min(A1,A2,...,An)</literal>
-        </para>
-    </refsection>
-    <refsection>
-        <title>Exemplos</title>
-        <programlisting role="example"><![CDATA[
-[m,n]=min([1,3,1])
-[m,n]=min([3,1,1],[1,3,1],[1,1,3])
-[m,n]=min([3,-2,1],1)
-[m,n]=min(list([3,1,1],[1,3,1],[1,1,3]))
-[m,n]=min(list(1,3,1))
- ]]></programlisting>
-    </refsection>
-    <refsection role="see also">
-        <title>Ver Também</title>
-        <simplelist type="inline">
-            <member>
-                <link linkend="gsort">gsort</link>
-            </member>
-            <member>
-                <link linkend="find">find</link>
-            </member>
-        </simplelist>
-    </refsection>
-</refentry>
index 32e45b9..625838a 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) 2018 - 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="max" 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="max" xml:lang="ru">
     <refnamediv>
         <refname>max</refname>
         <refpurpose>максимум</refpurpose>
     </refnamediv>
     <refsynopsisdiv>
         <title>Синтаксис</title>
-        <synopsis>[m [,k]]=max(A)
-            [m [,k]]=max(A,'c')
-            [m [,k]]=max(A,'r')
-            [m [,k]]=max(A,'m')
-            [m [,k]]=max(A1,A2,...,An)
-            [m [,k]]=max(list(A1,A2,...,An))
+        <synopsis>
+            m = max(A)
+            Col = max(A, 'c')
+            Row = max(A, 'r'|'m')
+            M = max(A1, A2,..., An)
+            M = max(list(A1, A2,..., An))
+            [.., K] = max(..)
         </synopsis>
     </refsynopsisdiv>
     <refsection>
         <title>Аргументы</title>
         <variablelist>
             <varlistentry>
-                <term>A</term>
+                <term>A, A1, ..., An</term>
+                <listitem>
+                    <para>
+                        скаляры, векторы, матрицы или гиперматрицы кодированных целых чисел или
+                        вещественных чисел в полном или разрежённом формате. Они должны иметь
+                        одинаковые размеры или быть смешанными со скалярами (скаляры,
+                        следовательно, неявно расширяются  до размеров массивов).
+                        Разрежённые массивы не могут смешиваться с полными массивами, за
+                        исключением <emphasis>отрицательных</emphasis> скаляров.
+                    </para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>m</term>
                 <listitem>
-                    <para>вещественный вектор или матрица</para>
+                    <para>
+                        одиночное число = максимум из всех значений элементов <varname>A</varname>.
+                        Всегда в полном формате, даже если <varname>A</varname> является разряжённой.
+                    </para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>Col</term>
+                <listitem>
+                    <para>
+                        вектор-столбец, если <varname>A</varname> является двумерной матрицей или
+                        гиперматрицей размерами <literal>size(A)</literal> с размером
+                        <literal>size(A,2)</literal> равным 1: максимумы по столбцам (для каждой
+                        строки).
+                        Если <varname>A</varname> - разрежённая матрица, то <varname>Col</varname>
+                        тоже разрежённый.
+                    </para>
                 </listitem>
             </varlistentry>
             <varlistentry>
-                <term>A1,...,An</term>
+                <term>Row</term>
                 <listitem>
                     <para>
-                        набор скаляров или вещественных векторов или матриц одного размера
+                        вектор-строка, если <varname>A</varname>  является двумерной матрицей или
+                        гиперматрицей размерами <literal>size(A)</literal> с размером
+                        <literal>size(A,2)</literal> равным 1: максимумы по строкам (для каждого
+                        стролбца).
+                        Если <varname>A</varname> - разрежённая матрица, то <varname>Row</varname>
+                        тоже разрежённый.
+                    </para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>M</term>
+                <listitem>
+                    <para>
+                        Массив размером = <literal>size(A1)</literal>, такой, что для каждого
+                        <literal>q</literal> <literal>M(q) = max(A1(q),A2(q),..An(q))</literal>.
+                        Если <varname>A</varname>,..,<varname>An</varname> - разрежённые матрицы, то
+                        <varname>M</varname> тоже разрежённый.
+                    </para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>K</term>
+                <listitem>
+                    <para>
+                        Указывает в <varname>A</varname> (первый) найденный максимум.
+                        Когда используется <literal>[m,K]=max(A)</literal>, то
+                        <itemizedlist>
+                            <listitem>
+                                Если <literal>A</literal> вектор, то <varname>K</varname> - скаляр.
+                            </listitem>
+                            <listitem>
+                                В противном случае <varname>K</varname> является вектор-строкой
+                                <literal>[i,j,..]</literal> индексов.
+                            </listitem>
+                        </itemizedlist>
+                    </para>
+                    <para>
+                        Для других синтаксисов <varname>K</varname> имеет форму и размеры, соответствующие
+                        <varname>Col</varname>, <varname>Row</varname> и <varname>M</varname>.
+                    </para>
+                    <para>
+                        Для синтаксиса <literal>[M,K] = max(A1,A2,..,An)</literal> имеем для каждого линейного
+                        индекса <literal>q</literal>:
+                        <literal>[M(q),K(q)] = max([A1(q) A2(q) .. An(q)])</literal>.
+                    </para>
+                    <para>
+                        <warning>
+                            <varname>K</varname> всегда в полном формате, даже когда
+                            <varname>A, A1,..,An</varname> в разрежённом виде. Следовательно, когда
+                            используется синтаксис <literal>[M,K]=max(A1,A2,..)</literal> с огромными,
+                            но разрежёнными матрицами, то это приводит к огромной <emphasis>полной</emphasis>
+                            матрице <varname>K</varname>. Пользователь должен проверить достаточно ли памяти
+                            имеется для этого.
+                        </warning>
                     </para>
                 </listitem>
             </varlistentry>
     <refsection>
         <title>Описание</title>
         <para>
-            Для <literal>A</literal>, вещественного вектора или матрицы,
-            <literal>max(A)</literal> возвращает элементом  <literal>A</literal>
-            с наибольшим значением. <literal>[m,k]=max(A)</literal> выдаёт дополнительно
-            индекс максимального элемента. Может использоваться второй аргумент:
-            <literal>'r'</literal> или <literal>'c'</literal>. <literal>'r'</literal>
-            используется для получения вектора-строки <literal>m</literal> такого,
-            что <literal>m(j)</literal> содержит максимум <literal>j</literal>-того столбца
-            <literal>A</literal> (<literal>A(:,j)</literal>), <literal>k(j)</literal>
-            даёт индекс строки, которая содержит максимум для столбца <literal>j</literal>.
-            <literal>'c'</literal> используется для аналогичной операции по строкам
-            <literal>A</literal>. <literal>'m'</literal> используется для совместимости
-            с Matlab.
+            Для <literal>A</literal> вещественного вектора или матрицы <literal>max(A)</literal> даёт
+            наибольший элемент в <literal>A</literal>.
+        </para>
+        <para>
+            <literal>[m,K]=max(A)</literal> даёт дополнительно индексы первого максимума.
+        </para>
+        <para>
+            Может быть использован второй строковый аргумент <literal>'r'</literal> или
+            <literal>'c'</literal>: <literal>'r'</literal> используется для получения
+            вектор-строки <literal>Row</literal> такой что <literal>Row(j)</literal>
+            содержит максимум <literal>j</literal>-го столбца <literal>A(:,j)</literal>,
+            <literal>K(j)</literal> даёт индекс строки, которая содержит максимум
+            столбца №<literal>j</literal>.
         </para>
         <para>
-            <literal>m=max(A1,A2,...,An)</literal>, где все <literal>Aj</literal>
-            являются матрицами одинакового размера, возвращает вектор или матрицу
-            <literal>m</literal> размером <literal>size(m)=size(A1)</literal>
-            такую, что <literal>m(i)= max(Aj(i)), j=1,...,n</literal>.
-            <literal>[m,k]=max(A1,A2,...,An)</literal> даёт дополнительно вектор или матрицу
-            <literal>k</literal>. Для фиксированного <literal>i</literal>,
-            <literal>k(i)</literal> является номером первого
-            <literal>Aj(i)</literal>, достигнувшего максимума.
+            <literal>'c'</literal> используется для парной операции по строкам <literal>A</literal>.
+            <literal>'m'</literal> используется для совместимости с Matlab.
         </para>
         <para>
-            <literal>[m,k]=max(list(A1,...,An))</literal> является эквивалентным
-            синтаксисом для <literal>[m,k]=max(A1,A2,...,An)</literal>.
+            <literal>[M,K]=max(list(A1,...,An))</literal> является эквивалентным для
+            <literal>[M,K]=max(A1,A2,...,An)</literal>.
         </para>
+        <note>
+            <itemizedlist>
+                <listitem>
+                    <literal>max()</literal> игнорирует значения <literal>NaN</literal> (если есть не
+                    только значения <literal>NaN</literal>).
+                </listitem>
+                <listitem>
+                    <literal>max([])</literal> возвращает <literal>[]</literal> для значений и индексов.
+                </listitem>
+            </itemizedlist>
+        </note>
     </refsection>
     <refsection>
         <title>Примеры</title>
         <programlisting role="example"><![CDATA[
-[m,n]=max([1,3,1])
-[m,n]=max([3,1,1],[1,3,1],[1,1,3])
-[m,n]=max([3,-2,1],1)
-[m,n]=max(list([3,1,1],[1,3,1],[1,1,3]))
-[m,n]=max(list(1,3,1))
+[m, k] = max([])
+[m, k] = max([1 5 ; 3 %nan])
+[m, k] = max([1 5 ; 3 %nan], 2.5)
+[m, k] = max([5 -1 1], [1 0 3], [2 1 3])
+[m, k] = max(list([5 -1 1], [1 0 3], [2 1 3]))
  ]]></programlisting>
+    <screen><![CDATA[
+--> [m, k] = max([])
+ m  =
+    []
+ k  =
+    []
+--> [m, k] = max([1 5 ; 3 %nan])
+ m  =
+   5.
+ k  =
+   1.   2.
+--> [m, k] = max([1 5 ; 3 %nan], 2.5)
+ m  =
+   2.5   5.
+   3.    2.5
+ k  =
+   2.   1.
+   1.   2.
+--> [m, k] = max([5 -1 1], [1 0 3], [2 1 3])
+ m  =
+   5.   1.   3.
+ k  =
+   1.   3.   2.
+]]></screen>
+        <para>
+            <emphasis role="bold">С опциями "r" или "c"</emphasis>:
+        </para>
+        <programlisting role="example"><![CDATA[
+A = grand(4,6,"uin",0,30); A(3,4) = %nan
+[Row, K] = max(A, "r")
+[Col, K] = max(A, "c")
+ ]]></programlisting>
+    <screen><![CDATA[
+--> A = grand(4,6,"uin",0,30); A(3,4) = %nan
+ A  =
+   18.   3.    22.   0.    13.   28.
+   16.   20.   25.   6.    10.   1.
+   25.   26.   20.   Nan   2.    21.
+   5.    9.    16.   15.   24.   25.
+--> [Row, K] = max(A, "r")
+ Row  =
+   25.   26.   25.   15.   24.   28.
+ K  =
+   3.   3.   2.   4.   4.   1.
+--> [Col, K] = max(A, "c")
+ Col  =
+   28.
+   25.
+   26.
+   25.
+ K  =
+   6.
+   3.
+   2.
+   6.
+ ]]></screen>
+        <para>
+            <emphasis role="bold">С разрежёнными входными данными</emphasis>:
+        </para>
+        <programlisting role="example"><![CDATA[
+s = sprand(5,4,0.5); k = s~=0; s(k) = round((s(k)-0.5)*10), full(s)
+[Row, K] = max(s, "r")
+[Col, K] = max(s, "c")
+[M, K] = max(s, -1);   [full(s)  ones(s(:,1))*%nan  full(M)]
+issparse(M)
+K
+ ]]></programlisting>
+    <screen><![CDATA[
+--> s = sprand(5,4,0.5); k = s~=0; s(k) = round((s(k)-0.5)*10), full(s)
+ s  =
+(  5,  4) sparse matrix
+(  1,  2)    -2.
+(  1,  3)    -4.
+(  1,  4)     3.
+(  2,  1)    -5.
+(  2,  4)     3.
+(  3,  2)    -2.
+(  3,  3)    -4.
+(  4,  2)     4.
+(  4,  4)     2.
+(  5,  2)    -5.
+(  5,  3)     5.
+(  5,  4)    -4.
+ ans  =
+   0.  -2.  -4.   3.
+  -5.   0.   0.   3.
+   0.  -2.  -4.   0.
+   0.   4.   0.   2.
+   0.  -5.   5.  -4.
+--> [Row, K] = max(s, "r")
+ Row  =
+(  1,  4) sparse matrix
+(  1,  2)     4.
+(  1,  3)     5.
+(  1,  4)     3.
+ K  =
+   1.   4.   5.   1.
+--> [Col, K] = max(s, "c")
+ Col  =
+(  5,  1) sparse matrix
+(  1,  1)     3.
+(  2,  1)     3.
+(  4,  1)     4.
+(  5,  1)     5.
+ K  =
+   4.
+   4.
+   1.
+   2.
+   3.
+--> [M, K] = max(s, -1);   [full(s)  ones(s(:,1))*%nan  full(M)]
+ ans  =
+   0.  -2.  -4.   3.   Nan   0.  -1.  -1.   3.
+  -5.   0.   0.   3.   Nan  -1.   0.   0.   3.
+   0.  -2.  -4.   0.   Nan   0.  -1.  -1.   0.
+   0.   4.   0.   2.   Nan   0.   4.   0.   2.
+   0.  -5.   5.  -4.   Nan   0.  -1.   5.  -1.
+--> issparse(M)
+ ans  =
+   1.
+--> K
+ K  =
+   1.   2.   2.   1.
+   2.   1.   1.   1.
+   1.   2.   2.   1.
+   1.   1.   1.   1.
+   1.   2.   1.   2.
+]]> </screen>
     </refsection>
     <refsection role="see also">
         <title>Смотрите также</title>
         <simplelist type="inline">
             <member>
+                <link linkend="min">min</link>
+            </member>
+            <member>
+                <link linkend="strange">strange</link>
+            </member>
+            <member>
+                <link linkend="mean">mean</link>
+            </member>
+            <member>
                 <link linkend="gsort">gsort</link>
             </member>
             <member>
                 <link linkend="find">find</link>
             </member>
             <member>
-                <link linkend="min">min</link>
+                <link linkend="full">full</link>
             </member>
         </simplelist>
     </refsection>
+    <refsection role="history">
+        <title>История</title>
+        <revhistory>
+            <revision>
+                <revnumber>6.0.2</revnumber>
+                <revdescription>
+                    Теперь max() действительно работает с разрежёнными матрицами
+                </revdescription>
+            </revision>
+        </revhistory>
+    </refsection>
 </refentry>
index 1dfe209..266ac26 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) 2018 - 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="min" 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="min" xml:lang="ru">
     <refnamediv>
         <refname>min</refname>
         <refpurpose>минимум</refpurpose>
     </refnamediv>
     <refsynopsisdiv>
         <title>Синтаксис</title>
-        <synopsis>[m [,k]]=min(A)
-            [m [,k]]=min(A,'c')
-            [m [,k]]=min(A,'r')
-            [m [,k]]=min(A,'m')
-            [m [,k]]=min(A1,A2,...,An)
-            [m [,k]]=min(list(A1,A2,...,An))
+        <synopsis>
+            m = min(A)
+            Col = min(A, 'c')
+            Row = min(A, 'r'|'m')
+            M = min(A1, A2,..., An)
+            M = min(list(A1, A2,..., An))
+            [.., K] = min(..)
         </synopsis>
     </refsynopsisdiv>
     <refsection>
         <title>Аргументы</title>
         <variablelist>
             <varlistentry>
-                <term>A</term>
+                <term>A, A1, ..., An</term>
+                <listitem>
+                    <para>
+                        скаляры, векторы, матрицы или гиперматрицы кодированных целых чисел или
+                        вещественных чисел в полном или разрежённом формате. Они должны иметь
+                        одинаковые размеры или быть смешанными со скалярами (скаляры,
+                        следовательно, неявно расширяются  до размеров массивов).
+                        Разрежённые массивы не могут смешиваться с полными массивами, за
+                        исключением <emphasis>положительных</emphasis> скаляров.
+                    </para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>m</term>
                 <listitem>
-                    <para>вещественный вектор или матрица</para>
+                    <para>
+                        одиночное число = минимум из всех значений элементов <varname>A</varname>.
+                        Всегда в полном формате, даже если <varname>A</varname> является разряжённой.
+                    </para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>Col</term>
+                <listitem>
+                    <para>
+                        вектор-столбец, если <varname>A</varname> является двумерной матрицей или
+                        гиперматрицей размерами <literal>size(A)</literal> с размером
+                        <literal>size(A,2)</literal> равным 1: минимумы по столбцам (для каждой
+                        строки).
+                        Если <varname>A</varname> - разрежённая матрица, то <varname>Col</varname>
+                        тоже разрежённый.
+                    </para>
                 </listitem>
             </varlistentry>
             <varlistentry>
-                <term>A1,...,An</term>
+                <term>Row</term>
                 <listitem>
                     <para>
-                        набор скаляров или вещественных векторов или матриц одинакового размера.
+                        вектор-строка, если <varname>A</varname>  является двумерной матрицей или
+                        гиперматрицей размерами <literal>size(A)</literal> с размером
+                        <literal>size(A,2)</literal> равным 1: минимумы по строкам (для каждого
+                        стролбца).
+                        Если <varname>A</varname> - разрежённая матрица, то <varname>Row</varname>
+                        тоже разрежённый.
+                    </para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>M</term>
+                <listitem>
+                    <para>
+                        Массив размером = <literal>size(A1)</literal>, такой, что для каждого
+                        <literal>q</literal> <literal>M(q) = min(A1(q),A2(q),..An(q))</literal>.
+                        Если <varname>A</varname>,...,<varname>An</varname> - разрежённые матрицы,
+                        то <varname>M</varname> тоже разрежённый.
+                    </para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>K</term>
+                <listitem>
+                    <para>
+                        Указывает в <varname>A</varname> (первый) найденный минимум.
+                        Когда используется <literal>[m,K]=min(A)</literal>, то
+                        <itemizedlist>
+                            <listitem>
+                                Если <literal>A</literal> вектор, то <varname>K</varname> - скаляр.
+                            </listitem>
+                            <listitem>
+                                В противном случае <varname>K</varname> является вектор-строкой
+                                <literal>[i,j,..]</literal> индексов.
+                            </listitem>
+                        </itemizedlist>
+                    </para>
+                    <para>
+                        Для других синтаксисов <varname>K</varname> имеет форму и размеры, соответствующие
+                        <varname>Col</varname>, <varname>Row</varname> и <varname>M</varname>.
+                    </para>
+                    <para>
+                        Для синтаксиса <literal>[M,K] = min(A1,A2,..,An)</literal> имеем для каждого линейного
+                        индекса <literal>q</literal>:
+                        <literal>[M(q),K(q)] = min([A1(q) A2(q) .. An(q)])</literal>.
+                    </para>
+                    <para>
+                        <warning>
+                            <varname>K</varname> всегда в полном формате, даже когда
+                            <varname>A, A1,..,An</varname> в разрежённом виде. Следовательно, когда
+                            используется синтаксис <literal>[M,K]=min(A1,A2,..)</literal> с огромными,
+                            но разрежёнными матрицами, то это приводит к огромной <emphasis>полной</emphasis>
+                            матрице <varname>K</varname>. Пользователь должен проверить достаточно ли памяти
+                            имеется для этого.
+                        </warning>
                     </para>
                 </listitem>
             </varlistentry>
     <refsection>
         <title>Описание</title>
         <para>
-            Для <literal>A</literal>, вещественного вектора или матрицы,
-            <literal>min(A)</literal> является наименьшим элементом <literal>A</literal>.
-            <literal>[m,k]=min(A)</literal> даёт дополнительно индекс минимума
-            Может использоваться второй аргумент: <literal>'r'</literal> или
-            <literal>'c'</literal>. <literal>'r'</literal> используется для получения
-            вектора-строки <literal>m</literal> такого, что <literal>m(j)</literal>
-            содержит минимум <literal>j</literal>-того столбца <literal>A</literal>
-            (<literal>A(:,j)</literal>), <literal>k(j)</literal> даёт индекс строки,
-            которая содержит минимум для столбца <literal>j</literal>.
-            <literal>'c'</literal> используется для аналогичной операции на строках
-            <literal>A</literal>. <literal>'m'</literal> используется для совместимости
-            с Matlab.
+            Для <literal>A</literal> вещественного вектора или матрицы <literal>min(A)</literal> даёт
+            наименьший элемент в <literal>A</literal>.
+        </para>
+        <para>
+            <literal>[m,K]=min(A)</literal> даёт дополнительно индексы первого минимума.
+        </para>
+        <para>
+            Может быть использован второй строковый аргумент <literal>'r'</literal> или
+            <literal>'c'</literal>: <literal>'r'</literal> используется для получения
+            вектор-строки <literal>Row</literal> такой что <literal>Row(j)</literal>
+            содержит минимум <literal>j</literal>-го столбца <literal>A(:,j)</literal>,
+            <literal>K(j)</literal> даёт индекс строки, которая содержит минимум
+            столбца №<literal>j</literal>.
         </para>
         <para>
-            <literal>m=min(A1,A2,...,An)</literal>, где все <literal>Aj</literal>
-            являются матрицами одинакового размера, возвращает вектор или матрицу
-            <literal>m</literal> размером <literal>size(m)=size(A1)</literal>
-            такую, что<literal>m(i)= min( Aj(i)), j=1,...,n</literal>.
-            <literal>[m,k]=min(A1,A2,...,An)</literal> даёт дополнительно вектор или
-            матрицу <literal>k</literal>. Для фиксированного <literal>i</literal>,
-            <literal>k(i)</literal> является номером первого
-            <literal>Aj(i)</literal>, достигшего минимума.
+            <literal>'c'</literal> используется для парной операции по строкам <literal>A</literal>.
+            <literal>'m'</literal> используется для совместимости с Matlab.
         </para>
         <para>
-            <literal>[m,k]=min(list(A1,...,An))</literal> является эквивалентным
-            синтаксисом для <literal>[m,k]=min(A1,A2,...,An)</literal>.
+            <literal>[M,K]=min(list(A1,...,An))</literal> является эквивалентным для
+            <literal>[M,K]=min(A1,A2,...,An)</literal>.
         </para>
+        <note>
+            <itemizedlist>
+               <listitem>
+                    <literal>min()</literal> игнорирует значения <literal>NaN</literal> (если есть не
+                    только значения <literal>NaN</literal>).
+                </listitem>
+                <listitem>
+                    <literal>min([])</literal> возвращает <literal>[]</literal> для значений и индексов.
+                </listitem>
+             </itemizedlist>
+        </note>
     </refsection>
     <refsection>
         <title>Примеры</title>
         <programlisting role="example"><![CDATA[
-[m,n]=min([1,3,1])
-[m,n]=min([3,1,1],[1,3,1],[1,1,3])
-[m,n]=min([3,-2,1],1)
-[m,n]=min(list([3,1,1],[1,3,1],[1,1,3]))
-[m,n]=min(list(1,3,1))
+[m, k] = min([])
+[m, k] = min([5 3 ; 2 %nan])
+[m, n] = min([5 3 ; 2 %nan], 4)
+[m, k] = min([5 -1 2], [1 5 1], [0 1 3])
+[m, k] = min(list([5 -1 2], [1 5 1], [0 1 3]))
+ ]]></programlisting>
+    <screen><![CDATA[
+--> [m, k] = min([])
+ m  =
+    []
+ k  =
+    []
+--> [m, k] = min([5 3 ; 2 %nan])
+ m  =
+   2.
+ k  =
+   2.   1.
+--> [m, k] = min([5 3 ; 2 %nan], 4)
+ m  =
+   4.   3.
+   2.   4.
+ k  =
+   2.   1.
+   1.   2.
+--> [m, k] = min([5 -1 2], [1 5 1], [0 1 3])
+ m  =
+   0.  -1.   1.
+ k  =
+   3.   1.   2.
+]]></screen>
+        <para>
+            <emphasis role="bold">С опциями "r" или "c"</emphasis>:
+        </para>
+        <programlisting role="example"><![CDATA[
+A = grand(4,6,"uin",0,30); A(3,4) = %nan
+[Row, K] = min(A, "r")
+[Col, K] = min(A, "c")
  ]]></programlisting>
+    <screen><![CDATA[
+--> A = grand(4,6,"uin",0,30); A(3,4) = %nan
+ A  =
+   24.   14.   24.   4.    6.    11.
+   23.   25.   29.   6.    19.   5.
+   30.   2.    20.   Nan    6.   6.
+   20.   8.    13.   14.   16.   3.
+--> [Row, K] = min(A, "r")
+ Row  =
+   20.   2.   13.   4.   6.   3.
+ K  =
+   4.   3.   4.   1.   1.   4.
+--> [Col, K] = min(A, "c")
+ Col  =
+   4.
+   5.
+   2.
+   3.
+ K  =
+   4.
+   6.
+   2.
+   6.
+ ]]></screen>
+        <para>
+            <emphasis role="bold">С разрежёнными входными данными</emphasis>:
+        </para>
+        <programlisting role="example"><![CDATA[
+s = sprand(5,4,0.5); k = s~=0; s(k) = round((s(k)-0.5)*10), full(s)
+[Row, K] = min(s, "r")
+[Col, K] = min(s, "c")
+[M, K] = min(s,1);   [full(s)  ones(s(:,1))*%nan  full(M)]
+issparse(M)
+K
+ ]]></programlisting>
+    <screen><![CDATA[
+--> s = sprand(5,4,0.5); k = s~=0; s(k) = round((s(k)-0.5)*10), full(s)
+ s  =
+(  5,  4) sparse matrix
+(  1,  3)     5.
+(  1,  4)    -2.
+(  2,  1)    -3.
+(  2,  3)    -5.
+(  3,  1)     3.
+(  3,  2)    -1.
+(  3,  3)     3.
+(  3,  4)     4.
+(  5,  3)     4.
+(  5,  4)    -5.
+ ans  =
+   0.   0.   5.  -2.
+  -3.   0.  -5.   0.
+   3.  -1.   3.   4.
+   0.   0.   0.   0.
+   0.   0.   4.  -5.
+--> [Row, K] = min(s, "r")
+ Row  =
+(  1,  4) sparse matrix
+(  1,  1)    -3.
+(  1,  2)    -1.
+(  1,  3)    -5.
+(  1,  4)    -5.
+ K  =
+   2.   3.   2.   5.
+--> [Col, K] = min(s, "c")
+ Col  =
+(  5,  1) sparse matrix
+(  1,  1)    -2.
+(  2,  1)    -5.
+(  3,  1)    -1.
+(  5,  1)    -5.
+ K  =
+   4.
+   3.
+   2.
+   1.
+   4.
+--> [M, K] = min(s,1);   [full(s)  ones(s(:,1))*%nan  full(M)]
+ ans  =
+   0.   0.   5.  -2.   Nan   0.   0.   1.  -2.
+  -3.   0.  -5.   0.   Nan  -3.   0.  -5.   0.
+   3.  -1.   3.   4.   Nan   1.  -1.   1.   1.
+   0.   0.   0.   0.   Nan   0.   0.   0.   0.
+   0.   0.   4.  -5.   Nan   0.   0.   1.  -5.
+--> issparse(M)
+ ans  =
+   1.
+--> K
+ K  =
+   1.   1.   2.   1.
+   1.   1.   1.   1.
+   2.   1.   2.   2.
+   1.   1.   1.   1.
+   1.   1.   2.   1.
+]]> </screen>
     </refsection>
     <refsection role="see also">
         <title>Смотрите также</title>
         <simplelist type="inline">
             <member>
+                <link linkend="max">max</link>
+            </member>
+            <member>
+                <link linkend="strange">strange</link>
+            </member>
+            <member>
+                <link linkend="mean">mean</link>
+            </member>
+            <member>
                 <link linkend="gsort">gsort</link>
             </member>
             <member>
                 <link linkend="find">find</link>
             </member>
             <member>
-                <link linkend="max">max</link>
+                <link linkend="full">full</link>
             </member>
         </simplelist>
     </refsection>
+    <refsection role="history">
+        <title>История</title>
+        <revhistory>
+            <revision>
+                <revnumber>6.0.2</revnumber>
+                <revdescription>
+                    Теперь min() действительно работает с разрежёнными матрицами
+                </revdescription>
+            </revision>
+        </revhistory>
+    </refsection>
 </refentry>
index a9872d8..f543cd5 100644 (file)
@@ -1,7 +1,7 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) 2010 - Scilab Enterprises - Adeline CARNIS
-//
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
+// Copyright (C) 2018 - 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.
@@ -14,269 +14,160 @@ function [m, k] = %sp_max(varargin)
     [lhs, rhs] = argn(0);
 
     elements = varargin;
-    error_list = %f;
+    error_list = "";
 
     // If the first argument is a list, it retrieves the number of sparse
     // matrices in list
     if type(varargin(1)) == 15 then
         if rhs <> 1 then
-            error(msprintf(_("%s: Wrong size of input argument: %d expected.\n"), "%sp_max", 1))
+            msg = _("%s: Wrong size of input argument: %d expected.\n")
+            error(msprintf(msg, "%sp_max", 1))
         end
 
         rhs = length(varargin(1));
         elements = varargin(1);
-        error_list = %t;
+        error_list = _(" (in list)");
 
         // If the second argument of list is not a sparse -> ERROR
         if rhs == 2 & type(elements(2)) <> 5 then
-            error(msprintf(_("%s: Wrong type for input argument #%d: A sparse matrix expected.\n"), "%sp_max", 1))
+            msg = _("%s: Wrong type for input argument #%d: A sparse matrix expected.\n")
+            error(msprintf(msg, "%sp_max", 1))
         end
     end
 
-    select rhs
-        // If rhs = 1, the first input argument must be a sparse
-    case 1
-        A1 = elements(1);
-
-        // Check if A is a sparse
-        if type(A1)<> 5 then
-            error(msprintf(_("%s: Wrong type for input argument #%d: A sparse matrix expected.\n"), "%sp_max", 1))
+    A1 = elements(1);         // Is necessarily a sparse, due to the %sp_ prefix
+    // Check if A1 is real
+    if ~isreal(A1) then
+        msg = _("%s: Argument #%d: Complex numbers not supported.\n")
+        error(msprintf(msg, "%sp_max", 1));
+    end
+    siz = size(A1);
+
+    // max(A)
+    // ------
+    if rhs==1
+        if isempty(A1) then
+            m = []
+            k = []
+            return
         end
-
         // Retrieves entries of sparse matrix
-        [ij, v, mn]= spget(A1);
-        if lhs == 1 then
-            if v == [] then
-                m = 0;
-            else
-                m = max(v);
-            end
+        [ij, v, mn] = spget(A1)
+
+        // Matrix of zeros:
+        if v==[] then
+            m = 0
+            k = 1
         else
-            if v == [] then
-                m = 0;
-                k = [1 1];
-            else
-                [m, i] = max(v);
-                if mn(1) == 1 then
-                    k = ij(i,2);
-                else
-                    if mn(2) == 1 then
-                        k = ij(i,1);
-                    else
-                        k = [ij(i,1) ij(i,2)];
-                    end
+            [m, k] = max(v);
+            k = ij(k,:)
+            if m<0 then
+                i = find(A1(:)==0,1)
+                if i~=[]
+                    m = 0
+                    k = i
                 end
             end
         end
-
-        // If A1 contains negative values and the length of v is less then mn(1)
-        // * mn(2), A1 contains one or several zeros
-        // So, max = 0
-        if m < 0 & length(v)<> mn(1)*mn(2) then
-            m = 0;
-            if lhs == 2 then
-                k = 0;
-                if mn(1) == 1 then
-                    for i = 1:length(v)
-                        if and(ij(:,2) <> i) then
-                            k = i;
-                            break;
-                        end
-                    end
-                else
-                    if mn(2) == 1 then
-                        for i = 1:length(v)
-                            if and(ij(:,1) <> i) then
-                                k = i;
-                                break;
-                            end
-                        end
-                    else
-                        // thanks to ij, find the position of zero value
-                        // But ij contains only the indices of non zero values
-                        // So check on first column the values 1:mn(1)
-                        // if posi is less than mn(2) then there is zero value
-                        cpt = 0;
-                        for i = 1:mn(1)
-                            posi = length(find(ij(:,1)==i));
-                            if posi <> mn(2) then
-                                for j = 1:mn(2)
-                                    // it is the last index of line where m = 0
-                                    if mn(2)*(i-1)+j ==  mn(2)*i then
-                                        k = [i, j];
-                                        break;
-                                    else
-                                        pos = find(ij(mn(2)*(i-1)+j,2) == j);
-                                        if pos == [] & k == 0 then
-                                            k = [i,j];
-                                            break;
-                                        end
-                                    end
-                                end
-                                if k <> 0 then
-                                    break;
-                                end
-                            end
-                        end
-                    end
-                end
-            end
+        if length(m)<2
+            m = full(m)
         end
-
-        // If rhs = 2, the second input argument can be a character or a sparse
-        // matrix
-    case 2
-        if lhs == 2 then
-            error(msprintf(_("%s: Wrong number of output argument: %d expected.\n"), "%sp_max", 1));
+        if mn(1)>1 & mn(2)>1 & length(k)==1
+            k = ind2sub(siz, k)
+        elseif (mn(1)<2 | mn(2)<2) & length(k)==2
+            k = sub2ind(siz,k)
         end
 
-        A1 = elements(1);
-
-        // Check if A is a sparse
-        if type(A1) <> 5  then
-            error(msprintf(_("%s: Wrong type for input argument #%d: A sparse matrix expected.\n"), "%sp_max", 1));
+    // max(A, "r"|"c"|"m")
+    // -------------------
+    elseif rhs==2 & type(elements(2))==10
+        opts = elements(2);
+        if ~or(opts==["c" "r" "m"]) then
+            msg = _("%s: Wrong value for input argument #%d: [''r'' ''c'' ''m''] expected.\n")
+            error(msprintf(msg, "%sp_max", 2))
         end
-
-        select type(elements(2))
-            // If the second argument is a string
-        case 10
-            opts = elements(2);
-            // Opts can be : 'c' 'r' or 'm'
-            ind = find(opts == ["c","r","m"]);
-            if (ind == []) then
-                error(msprintf(_("%s: Wrong value for input argument #%d: [''r'' ''c'' ''m''] expected.\n"),"%sp_max",2));
-            end
-
-            [ij, v, mn] = spget(A1);
-
-            // If mn(1) = 1, A1 is a row vector
-            if mn(1) == 1 then
-                // max(A1, 'r') = A1(1,:) because A1 is a row vector
-                if opts == "r" then
-                    m = A1;
-                    // max(A1, 'c') or max(A1, 'm') = max(A1)
-                else
-                    m = max(v', opts);
-                    if m < 0 & length(v)<> mn(1)*mn(2) then
-                        m = 0;
-                    end
-                end
-            end
-
-            // If mn(2) = 1, A1 is a column vector
-            if mn(2) == 1 then
-                if opts == "c" then
-                    m = A1;
-                else
-                    m = max(v, opts);
-                end
-                if m < 0 & length(v)<> mn(1)*mn(2) then
-                    m = 0;
-                end
-            end
-
-            // Return a sparse vector containing the max in terms of 'c', 'r' or 'm'
-            if mn(1) <> 1 & mn(2) <> 1 then
-
-                // If opts = 'c', the result is returned in column vector
-                if opts == "c" then
-                    m = spzeros(mn(1),1);
-                    for i = 1:mn(1)
-                        pos = length(find(ij(:,1)==i));
-                        if pos <> mn(2) then
-                            m(i) = 0;
-                        else
-                            m(i) = max(A1(i,:));
-                        end
-                    end
-                    // If opts = 'r' or 'm', the result is returned in row vector
-                else
-                    m = spzeros(1,mn(2));
-                    for i = 1:mn(2)
-                        pos = length(find(ij(:,2)==i));
-                        if pos <> mn(1) then
-                            m(i) = 0;
-                        else
-                            m(i) = max(A1(:,i));
-                        end
-                    end
-                end
+        if isempty(A1) then
+            m = A1
+            k = []
+            return
+        end
+        if siz(1)==1 & opts=="r"
+            m = A1
+            k = ones(1, siz(2))
+        elseif siz(2)==1 & opts=="c"
+            m = A1
+            k = ones(siz(1), 1)
+        else
+            if or(opts==["r" "m"])
+                A1 = A1'
             end
-
-        case 5
-            // If the second argument is a sparse
-            A2 = elements(2);
-
-            [m1, n1] = size(A1);
-            [m2, n2] = size(A2);
-
-            // Check the size of A2
-            if (m1 <> m2 | n1 <> n2) then
-                error(msprintf(_("%s: Wrong size of input argument #%d: Same size as input argument #%d expected.\n"), "%sp_max", 2, 1));
+            [ij, v, mn] = spget(A1)
+            // mprintf("""%s"" [%d, %d]\n", opts, siz(1), siz(2))
+            m = spzeros(mn(1), 1)
+            k = ones(mn(1), 1)
+            kk = unique(ij(:,1))
+            for j = kk'
+                [V,K] = max(A1(j,:))    // handles Nan correctly
+                m(j) = V
+                k(j) = K
             end
-
-            // Retrieve the indices of non-zeros
-            ij1 = spget(A1);
-            ij2 = spget(A2);
-
-            // A1 and A2 contain non zeros -> full
-            if size(ij1,"r") == m1*n1 & size(ij2,"r") == m2*n2 then
-                [m,k] = max(full(A1), full(A2));
-                m = sparse(m);
-                k = sparse(k);
-            else
-                m = A1;
-                pos = find(m < A2);
-                m(pos) = A2(pos);
+            // If opts = 'r' or 'm', the result is returned in row vector
+            if or(opts==["r" "m"]) then
+                m = m'
+                k = k'
             end
-
-        else
-            error(msprintf(_("%s: Wrong type for input argument #%d: A sparse matrix or a character expected.\n"), "%sp_max", 2));
         end
 
-        // Case : max(A1,A2,A3,..,An) or max(list(A1,A2,A3,..,An))
+    // max(A1,A2,...) or equivalently max(list(A1,A2,..))
+    // --------------------------------------------------
     else
-        if lhs == 2 then
-            error(msprintf(_("%s: Wrong number of output argument: %d expected.\n"), "%sp_max", 1));
-        end
         // m is the first matrix
         m = elements(1);
+        if lhs>1
+            k = ones(m)
+        end
+        [m1, n1] = size(m)
         // Loop on the number of input arguments
         for i = 2:rhs
-            An = elements(i);
-
+            An = elements(i)
             // Check if An is a sparse
-            if type(An) <> 5 then
-                if error_list then
-                    error(msprintf(_("%s: Wrong type for input argument #%d (List element: %d): A sparse matrix expected.\n"), "%sp_max", 1, i))
-                else
-                    error(msprintf(_("%s: Wrong type for input argument #%d: A sparse matrix expected.\n"), "%sp_max", i))
-                end
+            if and(type(An) <> [1 5])  | (type(An)==1 & or(size(An)~=[1 1])) then
+                msg = _("%s: Wrong type for input argument #%d%s: A sparse matrix or a scalar expected.\n")
+                error(msprintf(msg, "%sp_max", i, error_list))
             end
-
-            [m1, n1] = size(m);
-            [m2, n2] = size(An);
-
+            // Check if An is real
+            if ~isreal(An) then
+                msg = _("%s: Argument #%d%s: Complex numbers not supported.\n")
+                error(msprintf(msg, "%sp_max", i, error_list))
+            end
+            [m2, n2] = size(An)
             // Check size
-            if (m1 <> m2 | n1 <> n2) then
-                if error_list then
-                    error(msprintf(_("%s: Wrong size of input argument #%d (List element: %d): Same size as input argument #%d expected.\n"), "%sp_max", 1, i, 1))
-                else
-                    error(msprintf(_("%s: Wrong size of input argument #%d: Same size as input argument #%d expected.\n"), "%sp_max", i, 1))
-                end
+            if (m1 <> m2 | n1 <> n2) & or([m2 n2]~=[1 1]) then
+                msg = _("%s: Wrong size of input argument #%d%s: Same size as input argument #%d expected.\n")
+                error(msprintf(msg, "%sp_max", i, error_list, 1))
+            end
+            // If An is a scalar: check that it is negative
+            if and([m2 n2]==[1 1]) & An>0 then
+                msg = _("%s: Argument #%d: the scalar must be negative.\n")
+                error(msprintf(msg, "%sp_max", i))
             end
 
-            ij1 = spget(m);
-            ij2 = spget(An);
-
-            if size(ij1,"r") == m1*n1 & size(ij2,"r") == m2*n2 then
-                [m,k] = max(full(m), full(An));
-                m = sparse(m);
-                k = sparse(k);
+            // Processing:
+            mNan = isnan(m);
+            newNan = isnan(An);
+            pos = (m < An) | (mNan & ~newNan) | ..
+                  (mNan & newNan) // position of the last %nan, as with dense processing
+            if or([m2 n2]~=[1 1])
+                m(pos) = An(pos)
             else
-                pos = find(m < An);
-                m(pos) = An(pos);
+                m(pos) = An
+            end
+            if lhs > 1
+                k(pos) = i
             end
+        end  // for
+        if length(m)<2
+            m = full(m)
         end
     end
 endfunction
index 051f29b..63a19c9 100644 (file)
@@ -1,7 +1,7 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) 2010 - Scilab Enterprises - Adeline CARNIS
-//
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
+// Copyright (C) 2018 - 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.
@@ -14,273 +14,158 @@ function [m, k] = %sp_min(varargin)
     [lhs, rhs] = argn(0);
 
     elements = varargin;
-    error_list = %f;
+    error_list = "";
 
     // If the first argument is a list, it retrieves the number of sparse
     // matrices in list
     if type(varargin(1)) == 15 then
         if rhs <> 1 then
-            error(msprintf(_("%s: Wrong size of input argument: %d expected.\n"), "%sp_min", 1))
+            msg = _("%s: Wrong size of input argument: %d expected.\n")
+            error(msprintf(msg, "%sp_min", 1))
         end
 
-        rhs = length(varargin(1));
-        elements = varargin(1);
-        error_list = %t;
+        rhs = length(varargin(1))
+        elements = varargin(1)
+        error_list = _(" (in list)")
 
         // If the second argument of list is not a sparse -> ERROR
         if rhs == 2 & type(elements(2)) <> 5 then
-            error(msprintf(_("%s: Wrong type for input argument #%d: A sparse matrix expected.\n"), "%sp_min", 1))
+            msg = _("%s: Wrong type for input argument #%d: A sparse matrix expected.\n")
+            error(msprintf(msg, "%sp_min", 1))
         end
     end
 
-    select rhs
-        // If rhs = 1, the first input argument must be a sparse
-    case 1
-        A1 = elements(1);
-
-        // Check if A is a sparse
-        if type(A1)<> 5 then
-            error(msprintf(_("%s: Wrong type for input argument #%d: A sparse matrix expected.\n"), "%sp_min", 1))
+    A1 = elements(1);   // Is necessarily a sparse, due to the %sp_ prefix
+    // Check if A1 is real
+    if ~isreal(A1) then
+        msg = _("%s: Argument #%d: Complex numbers not supported.\n")
+        error(msprintf(msg, "%sp_min", 1));
+    end
+    siz = size(A1);
+
+    // min(A)
+    // ------
+    if rhs==1
+        if isempty(A1) then
+            m = []
+            k = []
+            return
         end
-
         // Retrieves entries of sparse matrix
-        [ij, v, mn]= spget(A1);
-        if lhs == 1 then
-            if v == [] then
-                m = 0;
-            else
-                m = min(v);
-            end
+        [ij, v, mn] = spget(A1)
+
+        // Matrix of zeros:
+        if v==[] then
+            m = 0
+            k = 1
         else
-            if v == [] then
-                m = 0;
-                k = [1 1];
-            else
-                [m, i] = min(v);
-                if mn(1) == 1 then
-                    k = ij(i,2);
-                else
-                    if mn(2) == 1 then
-                        k = ij(i,1);
-                    else
-                        k = [ij(i,1) ij(i,2)];
-                    end
+            [m, k] = min(v);
+            k = ij(k,:)
+            if m>0 then
+                i = find(A1(:)==0,1)
+                if i~=[]
+                    m = 0
+                    k = i
                 end
             end
         end
-
-        // If A1 contains positive values and the length of v is less then mn(1)
-        // * mn(2), A1 contains one or several zeros
-        // So, min = 0
-        if m > 0 & length(v)<> mn(1)*mn(2) then
-            m = 0;
-            if lhs == 2 then
-                k = 0;
-                if mn(1) == 1 then
-                    for i = 1:length(v)
-                        if and(ij(:,2) <> i) then
-                            k = i;
-                            break;
-                        end
-                    end
-                else
-                    if mn(2) == 1 then
-                        for i = 1:length(v)
-                            if and(ij(:,1) <> i) then
-                                k = i;
-                                break;
-                            end
-                        end
-                    else
-                        // thanks to ij, find the position of zero value
-                        // But ij contains only the indices of non zero values
-                        // So check on first column the values 1:mn(1)
-                        // if posi is less than mn(2) then there is zero value
-                        for i = 1:mn(1)
-                            posi = length(find(ij(:,1)==i));
-                            if posi <> mn(2) then
-                                for j = 1:mn(2)
-                                    // it is the last index of line where m = 0
-                                    if mn(2)*(i-1)+j ==  mn(2)*i then
-                                        k = [i, j];
-                                        break;
-                                    else
-                                        pos = find(ij(mn(2)*(i-1)+j,2) == j);
-                                        if pos == [] & k == 0 then
-                                            k = [i,j];
-                                            break;
-                                        end
-                                    end
-                                end
-                                if k <> 0 then
-                                    break;
-                                end
-                            end
-                        end
-                    end
-                end
-            end
+        if length(m)<2
+            m = full(m)
         end
-
-        // If rhs = 2, the second input argument can be a character or a sparse
-        // matrix
-    case 2
-        if lhs == 2 then
-            error(msprintf(_("%s: Wrong number of output argument: %d expected"), "%sp_min", 1));
+        if mn(1)>1 & mn(2)>1 & length(k)==1
+            k = ind2sub(siz, k)
+        elseif length(k)==2
+            k = sub2ind(siz,k)
         end
 
-        A1 = elements(1);
-
-        // Check if A is a sparse
-        if type(A1) <> 5  then
-            error(msprintf(_("%s: Wrong type for input argument #%d: A sparse matrix expected.\n"), "%sp_min", 1));
+    // min(A, "r"|"c"|"m")
+    // -------------------
+    elseif rhs==2 & type(elements(2))==10
+        if isempty(A1) then
+            m = A1
+            k = []
+            return
         end
-
-        select type(elements(2))
-            // If the second argument is a string
-        case 10
-            opts = elements(2);
-            // Opts can be : 'c' 'r' or 'm'
-            ind = find(opts == ["c","r","m"]);
-            if (ind == []) then
-                error(msprintf(_("%s: Wrong value for input argument #%d: [''r'' ''c'' ''m''] expected.\n"),"%sp_min",2));
-            end
-
-            [ij, v, mn] = spget(A1);
-
-            // If mn(1) = 1, A1 is a row vector
-            if mn(1) == 1 then
-                // min(A1, 'r') = A1(1,:) because A1 is a row vector
-                if opts == "r" then
-                    m = A1;
-                    // min(A1, 'c') or min(A1, 'm') = min(A1)
-                else
-                    m = min(v', opts);
-                    if m > 0 & length(v)<> mn(1)*mn(2) then
-                        m = 0;
-                    end
-                end
-            end
-
-            // If mn(2) = 1, A1 is a column vector
-            if mn(2) == 1 then
-                if opts == "c" then
-                    m = A1;
-                else
-                    m = min(v, opts);
-                end
-                if m > 0 & length(v)<> mn(1)*mn(2) then
-                    m = 0;
-                end
-            end
-
-            // Return a sparse vector containing the max in terms of 'c', 'r' or 'm'
-            if mn(1) <> 1 & mn(2) <> 1 then
-                m = spzeros(mn(1),1);
-                // If opts = 'c', the result is returned in column vector
-                if opts == "c" then
-                    m = spzeros(mn(1),1);
-                    for i = 1:mn(1)
-                        pos = length(find(ij(:,1)==i));
-                        if pos <> mn(2) then
-                            m(i) = 0;
-                        else
-                            m(i) = min(A1(i,:));
-                        end
-                    end
-                    // If opts = 'r' or 'm', the result is returned in row vector
-                else
-                    m = spzeros(1,mn(2));
-                    for i = 1:mn(2)
-                        pos = length(find(ij(:,2)==i));
-                        if pos <> mn(1) then
-                            m(i) = 0;
-                        else
-                            m(i) = min(A1(:,i));
-                        end
-                    end
-                end
-            end
-
-        case 5
-            // If the second argument is a sparse
-            A2 = elements(2);
-
-            // Check if A2 is a sparse
-            if type(A2) <> 5 then
-                error(msprintf(_("%s: Wrong type for input argument #%d: A sparse matrix expected.\n"), "%sp_min", 2));
-            end
-
-            [m1, n1] = size(A1);
-            [m2, n2] = size(A2);
-
-            // Check the size of A2
-            if (m1 <> m2 | n1 <> n2) then
-                error(msprintf(_("%s: Wrong size of input argument #%d: Same size as input argument #%d expected.\n"), "%sp_min", 2, 1));
-            end
-
-            // Retrieve the indices of non-zeros
-            ij1 = spget(A1);
-            ij2 = spget(A2);
-
-            // A1 and A2 contain non zeros -> full
-            if size(ij1,"r") == m1*n1 & size(ij2,"r") == m2*n2 then
-                [m,k] = min(full(A1), full(A2));
-                m = sparse(m);
-                k = sparse(k);
-            else
-                m = A1;
-                pos = find(m > A2);
-                m(pos) = A2(pos);
+        opts = elements(2);
+        if ~or(opts==["c","r","m"]) then
+            msg = _("%s: Wrong value for input argument #%d: [''r'' ''c'' ''m''] expected.\n")
+            error(msprintf(msg, "%sp_min", 2))
+        end
+        if or(opts==["r" "m"])
+            A1 = A1'
+        end
+        [ij, v, mn] = spget(A1)
+        m = spzeros(mn(1), 1)
+        k = ones(mn(1), 1)
+        ind = gsort([ij(:,1) v ij(:,2)], "lr", "i") // Row  Val  Col
+        [tmp, kk] = unique(ind(:,1))
+        tab = ind(kk,:)
+        [i v K] = (tab(:,1), tab(:,2), tab(:,3))
+        ind = find(v>0)
+        for j = ind
+            kk = find(A1(i(j),:)==0,1)
+            if kk ~= []
+                v(j) = 0
+                K(j) = kk
             end
-
-        else
-            error(msprintf(_("%s: Wrong type for input argument #%d: A sparse matrix or a character expected.\n"), "%sp_min", 2));
+        end
+        m(i) = v
+        k(i) = K
+        // If opts = 'r' or 'm', the result is returned in row vector
+        if or(opts==["r" "m"]) then
+            m = m'
+            k = k'
         end
 
-        // Case : max(A1,A2,A3,..,An) or max(list(A1,A2,A3,..,An))
+    // min(A1,A2,...) or equivalently min(list(A1,A2,..))
+    // --------------------------------------------------
     else
-        if lhs == 2 then
-            error(msprintf(_("%s: Wrong number of output argument: %d expected"), "%sp_min", 1));
-        end
         // m is the first matrix
         m = elements(1);
+        if lhs>1
+            k = ones(m)
+        end
+        [m1, n1] = size(m)
         // Loop on the number of input arguments
         for i = 2:rhs
-            An = elements(i);
-
+            An = elements(i)
             // Check if An is a sparse
-            if type(An) <> 5 then
-                if error_list then
-                    error(msprintf(_("%s: Wrong type for input argument #%d (List element: %d): A sparse matrix expected.\n"), "%sp_min", 1, i))
-                else
-                    error(msprintf(_("%s: Wrong type for input argument #%d: A sparse matrix expected.\n"), "%sp_min", i))
-                end
+            if and(type(An) <> [1 5])  | (type(An)==1 & or(size(An)~=[1 1])) then
+                msg = _("%s: Wrong type for input argument #%d%s: A sparse matrix or a scalar expected.\n")
+                error(msprintf(msg, "%sp_min", i, error_list))
             end
-
-            [m1, n1] = size(m);
-            [m2, n2] = size(An);
-
+            // Check if An is real
+            if ~isreal(An) then
+                msg = _("%s: Argument #%d%s: Complex numbers not supported.\n")
+                error(msprintf(msg, "%sp_min", i, error_list))
+            end
+            [m2, n2] = size(An)
             // Check size
-            if (m1 <> m2 | n1 <> n2) then
-                if error_list then
-                    error(msprintf(_("%s: Wrong size of input argument #%d (List element: %d): Same size as input argument #%d expected.\n"), "%sp_min", 1, i, 1))
-                else
-                    error(msprintf(_("%s: Wrong size of input argument #%d: Same size as input argument #%d expected.\n"), "%sp_min", i, 1))
-                end
+            if (m1 <> m2 | n1 <> n2) & or([m2 n2]~=[1 1]) then
+                msg = _("%s: Wrong size of input argument #%d%s: Same size as input argument #%d expected.\n")
+                error(msprintf(msg, "%sp_min", i, error_list, 1))
             end
-
-            ij1 = spget(m);
-            ij2 = spget(An);
-
-            if size(ij1,"r") == m1*n1 & size(ij2,"r") == m2*n2 then
-                [m,k] = min(full(m), full(An));
-                m = sparse(m);
-                k = sparse(k);
+            // If An is a scalar: check that it is positive
+            if and([m2 n2]==[1 1]) & An<0 then
+                msg = _("%s: Argument #%d: the scalar must be positive.\n")
+                error(msprintf(msg, "%sp_max", i))
+            end
+            // Processing:
+            mNan = isnan(m);
+            newNan = isnan(An);
+            pos = (m > An) | (mNan & ~newNan) | ..
+                  (mNan & newNan) // position of the last %nan, as with dense processing
+            if or([m2 n2]~=[1 1])
+                m(pos) = An(pos)
             else
-                pos = find(m > An);
-                m(pos) = An(pos);
+                m(pos) = An
+            end
+            if lhs > 1
+                k(pos) = i
             end
+        end  // for
+        if length(m)<2
+            m = full(m)
         end
     end
 endfunction
diff --git a/scilab/modules/elementary_functions/tests/unit_tests/max.dia.ref b/scilab/modules/elementary_functions/tests/unit_tests/max.dia.ref
deleted file mode 100644 (file)
index a1034d5..0000000
+++ /dev/null
@@ -1,313 +0,0 @@
-// =============================================================================
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) ????-2008 - INRIA
-// Copyright (C) 2012 - Scilab Enterprises - Adeline CARNIS
-//
-//  This file is distributed under the same license as the Scilab package.
-// =============================================================================
-// <-- CLI SHELL MODE -->
-Ntest = 1;
-// test max(A) : A matrix
-// maxi is compared with sort
-for i = 1:Ntest,
-    m = 100;n = 200;a = rand(m,n);
-    [am,ak] = max(a); [a1,ak1] = gsort(a);
-    assert_checkequal(am, a1(1,1));
-    assert_checkequal(ak(1) + m * (ak(2) - 1), ak1(1,1));
-end
-// test max(A) : A vector
-for i = 1:Ntest,
-    m = 100;a = rand(1,m);
-    [am,ak] = max(a); [a1,ak1] = gsort(a);
-    assert_checkequal(am, a1(1,1));
-    assert_checkequal(ak, ak1(1,1));
-end
-// test mini
-for i=1:Ntest,
-    m = 100;n = 200;a = rand(m,n);
-    [am,ak] = max(-a); [ami,aki] = min(a);
-    assert_checkequal(am, -ami);
-    assert_checkequal(ak, aki);
-end
-for i = 1:Ntest,
-    m = 100;a = rand(1,m);
-    [am,ak] = max(-a); [ami,aki] = min(a);
-    assert_checkequal(am, -ami);
-    assert_checkequal(ak, aki);
-end
-// test max(A1,A....) compared with usual maxi + feval
-m = 10;
-n = 20;
-A1 = rand(m,n);
-A2 = rand(m,n);
-A3 = rand(m,n);
-A4 = rand(m,n);
-function [y]=f(i,j)
-    [y,k]=max([A1(i,j),A2(i,j),A3(i,j),A4(i,j)]);y=y+%i*k;
-endfunction
-A = feval(1:m,1:n,f);
-Am = real(A);Ak = imag(A);
-[Am1, Ak1] = max(A1, A2, A3, A4);
-assert_checkequal(Am1, Am);
-assert_checkequal(Ak1, Ak);
-// test max(list(A1,A2,..)) compared to max(A1,..)
-[Al, Akl] = max(list(A1, A2, A3, A4));
-assert_checkequal(Al, Am);
-assert_checkequal(Akl, Ak);
-// test max(A,'c') and max(A,'r')
-// max(A,'r') returns a row vector which contains max for each column
-[Am, Akm] = max(A1, "r");
-nc = size(A1, "c");
-Am1 = [];
-Ak1 = [];
-for i = 1:nc
-    [am, ak] = max(A1(:,i));
-    Am1 = [Am1, am];
-    Ak1 = [Ak1, ak];
-end
-assert_checkequal(Am, Am1);
-assert_checkequal(Akm, Ak1);
-// max(A,'c');
-[Am, Akm] = max(A1, "c");
-nc = size(A1, "r");
-Am1 = [];
-Ak1 = [];
-for i = 1:nc
-    [am, ak] = max(A1(i,:));
-    Am1 = [Am1; am];
-    Ak1 = [Ak1; ak];
-end
-assert_checkequal(Am, Am1);
-assert_checkequal(Akm, Ak1);
-// ******************** WITH SPARSES ********************
-// check error messages
-A = [1 2;3 4];
-A = sparse(A);
-assert_checkfalse(execstr("[m,i] = max(A,''c'')", "errcatch") == 0);
-refMsg = msprintf(_("%s: Wrong number of output argument: %d expected.\n"), "%sp_max", 1);
-assert_checkerror("[m,i] = max(A,''c'')", refMsg);
-A = [1 2;3 4];
-A = sparse(A);
-assert_checkfalse(execstr("m = max(A,full(A))", "errcatch") == 0);
-refMsg = msprintf(_("%s: Wrong type for input argument #%d: A sparse matrix or a character expected.\n"), "%sp_max", 2);
-assert_checkerror("m = max(A,full(A))", refMsg);
-B = sparse([1 2]);
-assert_checkfalse(execstr("m = max(A,B)", "errcatch") == 0);
-refMsg = msprintf(_("%s: Wrong size of input argument #%d: Same size as input argument #%d expected.\n"), "%sp_max", 2, 1);
-assert_checkerror("m = max(A,B)", refMsg);
-B = B';
-assert_checkfalse(execstr("m = max(A,B)", "errcatch") == 0);
-refMsg = msprintf(_("%s: Wrong size of input argument #%d: Same size as input argument #%d expected.\n"), "%sp_max", 2, 1);
-assert_checkerror("m = max(A,B)", refMsg);
-B = [6 7;8 9];
-C = [2 4; 6 8];
-assert_checkfalse(execstr("[m,i] = max(A,B,C)", "errcatch") == 0);
-refMsg = msprintf(_("%s: Wrong number of output argument: %d expected.\n"), "%sp_max", 1);
-assert_checkerror("[m,i] = max(A,B,C)", refMsg);
-assert_checkfalse(execstr("m = max(A,sparse(B),C)", "errcatch") == 0);
-refMsg = msprintf(_("%s: Wrong type for input argument #%d: A sparse matrix expected.\n"), "%sp_max", 3);
-assert_checkerror("m = max(A,sparse(B),C)", refMsg);
-L = list(A,sparse(B),C);
-assert_checkfalse(execstr("m = max(L)", "errcatch") == 0);
-refMsg = msprintf(_("%s: Wrong type for input argument #%d (List element: %d): A sparse matrix expected.\n"), "%sp_max", 1, 3);
-assert_checkerror("m = max(L)", refMsg);
-C = sparse([1 2]);
-L = list(A,sparse(B),C);
-assert_checkfalse(execstr("m = max(L)", "errcatch") == 0);
-refMsg = msprintf(_("%s: Wrong size of input argument #%d (List element: %d): Same size as input argument #%d expected.\n"), "%sp_max", 1, 3, 1);
-assert_checkerror("m = max(L)", refMsg);
-assert_checkfalse(execstr("m = max(A,sparse(B),C)", "errcatch") == 0);
-refMsg = msprintf(_("%s: Wrong size of input argument #%d: Same size as input argument #%d expected.\n"), "%sp_max", 3, 1);
-assert_checkerror("m = max(A,sparse(B),C)", refMsg);
-a = -1 * rand(3,2);
-a(2) = 0;
-A = sparse(a);
-[m, i] = max(a);
-[m1, i1] = max(A);
-assert_checkequal(m1,m);
-assert_checkequal(i1,i);
-[m, i] = max(a');
-[m1, i1] = max(A');
-assert_checkequal(m1,m);
-assert_checkequal(i1,i);
-[m, i] = max(a(:));
-[m1, i1] = max(A(:));
-assert_checkequal(m1,m);
-assert_checkequal(i1,i);
-[m, i] = max(a(:)');
-[m1, i1] = max(A(:)');
-assert_checkequal(m1,m);
-assert_checkequal(i1,i);
-a = [-3 -4;0 -1;-5 -6];
-A = sparse(a);
-[m, i] = max(a);
-[m1, i1] = max(A);
-assert_checkequal(m1,m);
-assert_checkequal(i1,i);
-[m, i] = max(a');
-[m1, i1] = max(A');
-assert_checkequal(m1,m);
-assert_checkequal(i1,i);
-[m, i] = max(a(:));
-[m1, i1] = max(A(:));
-assert_checkequal(m1,m);
-assert_checkequal(i1,i);
-[m, i] = max(a(:)');
-[m1, i1] = max(A(:)');
-assert_checkequal(m1,m);
-assert_checkequal(i1,i);
-b = [-5 0;-1 -6];
-B = sparse(b);
-[m, i] = max(b);
-[m1, i1] = max(B);
-assert_checkequal(m1,m);
-assert_checkequal(i1,i);
-[m, i] = max(b');
-[m1, i1] = max(B');
-assert_checkequal(m1,m);
-assert_checkequal(i1,i);
-[m, i] = max(b(:));
-[m1, i1] = max(B(:));
-assert_checkequal(m1,m);
-assert_checkequal(i1,i);
-[m, i] = max(b(:)');
-[m1, i1] = max(B(:)');
-assert_checkequal(m1,m);
-assert_checkequal(i1,i);
-s = rand(3,2);
-s(2) = 0;
-S = sparse(s);
-[m, i] = min(s);
-[m1, i1] = min(S);
-assert_checkequal(m1,m);
-assert_checkequal(i1,i);
-[m, i] = min(s');
-[m1, i1] = min(S');
-assert_checkequal(m1,m);
-assert_checkequal(i1,i);
-[m, i] = min(s(:));
-[m1, i1] = min(S(:));
-assert_checkequal(m1,m);
-assert_checkequal(i1,i);
-[m, i] = min(s(:)');
-[m1, i1] = min(S(:)');
-assert_checkequal(m1,m);
-assert_checkequal(i1,i);
-v = [1 4;7 6];
-V = sparse(v);
-[m, i] = max(v);
-[m1, i1] = max(V);
-assert_checkequal(m1,m);
-assert_checkequal(i1,i);
-[m, i] = max(v');
-[m1, i1] = max(V');
-assert_checkequal(m1,m);
-assert_checkequal(i1,i);
-[m, i] = max(v(:));
-[m1, i1] = max(V(:));
-assert_checkequal(m1,m);
-assert_checkequal(i1,i);
-[m, i] = max(v(:)');
-[m1, i1] = max(V(:)');
-assert_checkequal(m1,m);
-assert_checkequal(i1,i);
-// max(A1, A2,..., An)
-A1 = sprand(3,3,3);
-A2 = sprand(3,3,3);
-A3 = sprand(3,3,3);
-m = max(full(A1), full(A2), full(A3));
-m1 = max(A1, A2, A3);
-assert_checkequal(full(m1), m);
-// with list
-m = max(list(full(A1), full(A2), full(A3)));
-m1 = max(list(A1, A2, A3));
-assert_checkequal(full(m1), m);
-// min(A1, A2,..., An)
-A1 = sprand(3,3,3);
-A2 = sprand(3,3,3);
-A3 = sprand(3,3,3);
-m = min(full(A1), full(A2), full(A3));
-m1 = min(A1, A2, A3);
-assert_checkequal(full(m1), m);
-// with list
-m = min(list(full(A1), full(A2), full(A3)));
-m1 = min(list(A1, A2, A3));
-assert_checkequal(full(m1), m);
-for i = 1:Ntest,
-    m = 100;a = rand(1,m);
-    [am,ak] = max(-a); [ami,aki] = min(a);
-    assert_checkequal(am, -ami);
-    assert_checkequal(ak, aki);
-end
-// test max(A1,A....) compared with usual maxi + feval
-m = 10;
-n = 20;
-A1 = sprand(m,n,10);
-A2 = sprand(m,n,10);
-A3 = sprand(m,n,10);
-A4 = sprand(m,n,10);
-function [y]=f(i,j)
-    [y,k]=max([A1(i,j),A2(i,j),A3(i,j),A4(i,j)]);y=y+%i*k;
-endfunction
-A = feval(1:m,1:n,f);
-Am = real(A);Ak = imag(A);
-Am1 = max(A1, A2, A3, A4);
-assert_checkequal(Am1, sparse(Am));
-// test max(list(A1,A2,..)) compared to max(A1,..)
-Al = max(list(A1, A2, A3, A4));
-assert_checkequal(Al, sparse(Am));
-// test max(A,'c') and max(A,'r')
-// max(A,'r') returns a row vector which contains max for each column
-[Am] = max(A1, "r");
-nc = size(A1, "c");
-Am1 = [];
-for i = 1:nc
-    [am] = max(A1(:,i));
-    Am1 = [Am1, am];
-end
-assert_checkequal(Am, sparse(Am1));
-// max(A,'c');
-[Am] = max(A1, "c");
-nc = size(A1, "r");
-Am1 = [];
-for i = 1:nc
-    [am] = max(A1(i,:));
-    Am1 = [Am1; am];
-end
-assert_checkequal(Am, sparse(Am1));
-// test min(A1,A....) compared with usual maxi + feval
-m = 10;
-n = 20;
-A1 = sprand(m,n,10);
-A2 = sprand(m,n,10);
-A3 = sprand(m,n,10);
-A4 = sprand(m,n,10);
-function [y]=g(i,j)
-    [y,k]=min([A1(i,j),A2(i,j),A3(i,j),A4(i,j)]);y=y+%i*k;
-endfunction
-A = feval(1:m,1:n,g);
-Am = real(A);Ak = imag(A);
-Am1 = min(A1, A2, A3, A4);
-assert_checkequal(Am1, sparse(Am));
-// test min(list(A1,A2,..)) compared to min(A1,..)
-Al = min(list(A1, A2, A3, A4));
-assert_checkequal(Al, sparse(Am));
-// test min(A,'c') and min(A,'r')
-// min(A,'r') returns a row vector which contains min for each column
-[Am] = min(A1, "r");
-nc = size(A1, "c");
-Am1 = [];
-for i = 1:nc
-    [am] = min(A1(:,i));
-    Am1 = [Am1, am];
-end
-assert_checkequal(Am, sparse(Am1));
-// min(A,'c');
-[Am] = min(A1, "c");
-nc = size(A1, "r");
-Am1 = [];
-for i = 1:nc
-    [am] = min(A1(i,:));
-    Am1 = [Am1; am];
-end
-assert_checkequal(Am, sparse(Am1));
index 74f1422..7ad7d4e 100644 (file)
@@ -2,11 +2,14 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) ????-2008 - INRIA
 // Copyright (C) 2012 - Scilab Enterprises - Adeline CARNIS
+// Copyright (C) 2018 - Samuel GOUGEON
 //
 //  This file is distributed under the same license as the Scilab package.
 // =============================================================================
 
 // <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+// <-- ENGLISH IMPOSED -->
 
 Ntest = 1;
 // test max(A) : A matrix
@@ -101,16 +104,11 @@ assert_checkequal(Akm, Ak1);
 
 // ******************** WITH SPARSES ********************
 // check error messages
-A = [1 2;3 4];
-A = sparse(A);
-assert_checkfalse(execstr("[m,i] = max(A,''c'')", "errcatch") == 0);
-refMsg = msprintf(_("%s: Wrong number of output argument: %d expected.\n"), "%sp_max", 1);
-assert_checkerror("[m,i] = max(A,''c'')", refMsg);
-
+// --------------------
 A = [1 2;3 4];
 A = sparse(A);
 assert_checkfalse(execstr("m = max(A,full(A))", "errcatch") == 0);
-refMsg = msprintf(_("%s: Wrong type for input argument #%d: A sparse matrix or a character expected.\n"), "%sp_max", 2);
+refMsg = msprintf(_("%s: Wrong type for input argument #%d: A sparse matrix or a scalar expected.\n"), "%sp_max", 2);
 assert_checkerror("m = max(A,full(A))", refMsg);
 
 B = sparse([1 2]);
@@ -125,31 +123,88 @@ assert_checkerror("m = max(A,B)", refMsg);
 
 B = [6 7;8 9];
 C = [2 4; 6 8];
-assert_checkfalse(execstr("[m,i] = max(A,B,C)", "errcatch") == 0);
-refMsg = msprintf(_("%s: Wrong number of output argument: %d expected.\n"), "%sp_max", 1);
-assert_checkerror("[m,i] = max(A,B,C)", refMsg);
-
-
 assert_checkfalse(execstr("m = max(A,sparse(B),C)", "errcatch") == 0);
-refMsg = msprintf(_("%s: Wrong type for input argument #%d: A sparse matrix expected.\n"), "%sp_max", 3);
+refMsg = msprintf(_("%s: Wrong type for input argument #%d: A sparse matrix or a scalar expected.\n"), "%sp_max", 3);
 assert_checkerror("m = max(A,sparse(B),C)", refMsg);
 
 L = list(A,sparse(B),C);
 assert_checkfalse(execstr("m = max(L)", "errcatch") == 0);
-refMsg = msprintf(_("%s: Wrong type for input argument #%d (List element: %d): A sparse matrix expected.\n"), "%sp_max", 1, 3);
+refMsg = msprintf(_("%s: Wrong type for input argument #%d (in list): A sparse matrix or a scalar expected.\n"), "%sp_max", 3);
 assert_checkerror("m = max(L)", refMsg);
 
 C = sparse([1 2]);
 L = list(A,sparse(B),C);
 assert_checkfalse(execstr("m = max(L)", "errcatch") == 0);
-refMsg = msprintf(_("%s: Wrong size of input argument #%d (List element: %d): Same size as input argument #%d expected.\n"), "%sp_max", 1, 3, 1);
+refMsg = msprintf(_("%s: Wrong size of input argument #%d (in list): Same size as input argument #%d expected.\n"), "%sp_max", 3, 1);
 assert_checkerror("m = max(L)", refMsg);
 
 assert_checkfalse(execstr("m = max(A,sparse(B),C)", "errcatch") == 0);
 refMsg = msprintf(_("%s: Wrong size of input argument #%d: Same size as input argument #%d expected.\n"), "%sp_max", 3, 1);
 assert_checkerror("m = max(A,sparse(B),C)", refMsg);
 
+// --- checks min() and max() with sparse, with %nan and second output [r,k] = ...
+// -------------------------------------------------------------------
+empty = spzeros(0, 0);
+scalar = sprand(1, 1, 1);
+row = sprand(1, 10, 0.5);
+row(3) = %nan;
+col = row';
+mat = sprand(10,10,0.3);
+mat(3,:) = rand(1,10) + 1;
+mat(:,5) = rand(1,10) + 1;
+mat(2,4) = %nan;
+for fun = list(min, max)
+    for object = list(empty, scalar, row, col, mat)
+        [vref, kref] = fun(full(object))
+        [v, k] = fun(object);
+        c = length(v)>1;
+        assert_checktrue(issparse(v)==c);
+        assert_checktrue(~issparse(k));
+        assert_checkequal(full(v), vref);
+        assert_checkequal(k, kref);
+
+        [vref, kref] = fun(full(object), "c");
+        [v, k] = fun(object, "c");
+        assert_checktrue(issparse(v));
+        assert_checktrue(~issparse(k));
+        assert_checkequal(full(v), vref);
+        assert_checkequal(k, kref);
+
+        [vref, kref] = fun(full(object), "r");
+        [v, k] = fun(object, "r");
+        assert_checktrue(issparse(v));
+        assert_checktrue(~issparse(k));
+        assert_checkequal(full(v), vref);
+        assert_checkequal(k, kref);
+    end
+end
+// min(A1,A2, ..) | max(A1,A2,..)
+scalar2 = sprand(1, 1, 1);
+row2 = sprand(1, 10, 0.5);
+row2([3 7]) = %nan;
+col2 = row2';
+mat2 = sprand(10,10,0.3);
+mat2(3,:) = rand(1,10) + 1;
+mat2(:,5) = rand(1,10) + 1;
+mat2(7,4) = %nan;
+for fun = list(min, max)
+    if fun==max
+        scalar2 = scalar2 - 1
+    end
+    for o = ["scalar" "row" "col" "mat"]
+        execstr(msprintf("[vref, kref] = fun(full(%s), full(%s2))\n", o, o));
+        err = execstr(msprintf("[v, k] = fun(%s, %s2)\n", o, o), "errcatch");
+        assert_checktrue(err==0);
+
+        c = length(v)>1;
+        assert_checktrue(issparse(v)==c);
+        assert_checktrue(~issparse(k));
+        assert_checkequal(full(v), vref);
+        assert_checkequal(k, kref);
+    end
+end
 
+// ------------ Other tests with sparse matrices ----
 a = -1 * rand(3,2);
 a(2) = 0;
 A = sparse(a);