* Bug 16257: blockdiag() introduced 40/21140/4
Samuel GOUGEON [Tue, 26 Nov 2019 21:15:39 +0000 (22:15 +0100)]
  http://bugzilla.scilab.org/16257
  PDF page: http://bugzilla.scilab.org/attachment.cgi?id=5028

  sysdiag() will be obsoleted after merging this commit
  (blockdiag() must first be available)

Change-Id: Ib5886cd71970f63c899ffad585ec9a98e871863b

scilab/CHANGES.md
scilab/modules/elementary_functions/help/en_US/elementarymatrices/blockdiag.xml [new file with mode: 0644]
scilab/modules/elementary_functions/help/ru_RU/elementarymatrices/blockdiag.xml [new file with mode: 0644]
scilab/modules/elementary_functions/macros/blockdiag.sci [new file with mode: 0644]
scilab/modules/elementary_functions/tests/unit_tests/blockdiag.tst [new file with mode: 0644]
scilab/modules/helptools/data/configuration/scilab_macros.txt
scilab/modules/helptools/etc/images_md5.txt
scilab/modules/helptools/images/_LaTeX_blockdiag.xml_1.png [new file with mode: 0644]
scilab/modules/m2sci/help/en_US/m2sci_equivalents/b/blkdiag.xml

index fb929c2..d4b61cc 100644 (file)
@@ -105,6 +105,8 @@ Feature changes and additions
   - Automatic detection of the input data format implemented.
   - `-toStruct` option added, to return results in a structure instead of in the calling environment.
 * `jremove` is optional and `clear` could be used to release Java objects mapped to Scilab.
+* `blockdiag()` is introduced to improve, replace, and extend `sysdiag()` to strings.
+
 
 Help pages:
 -----------
@@ -203,9 +205,13 @@ Bug Fixes
 * [#16174](http://bugzilla.scilab.org/show_bug.cgi?id=16174): `libraryinfo` yielded 0x0 matrix of strings for libs without macro
 * [#16208](http://bugzilla.scilab.org/show_bug.cgi?id=16208): Using 3D string matrix with old C-api gateways may crash Scilab.
 * [#16209](http://bugzilla.scilab.org/show_bug.cgi?id=16209): grand() causes a freeze after several consecutive calls when using default base generator.
+<<<<<<< HEAD
 * [#16242](http://bugzilla.scilab.org/show_bug.cgi?id=16242): `loadmatfile()` could not read Octave native text data files.
 * [#16263](http://bugzilla.scilab.org/show_bug.cgi?id=16263): Polynomial insertion was broken for complex case.
 * [#16264](http://bugzilla.scilab.org/show_bug.cgi?id=16264): After empty for loop iterator was left uninitialized.
 * [#16271](http://bugzilla.scilab.org/show_bug.cgi?id=16271): `loadmatfile()` was never able to automatically detect the input data format.
 * [#16272](http://bugzilla.scilab.org/show_bug.cgi?id=16272): `spzeros(0,n)` and `spzeros(n,0)` were different from `sparse(0,0)`.
 
+=======
+* [#16257](http://bugzilla.scilab.org/show_bug.cgi?id=16257): `blockdiag()` implemented to replace `sysdiag()`, improved and extended to strings.
+>>>>>>> 4adc766322d... * Bug 16257: blockdiag() introduced
diff --git a/scilab/modules/elementary_functions/help/en_US/elementarymatrices/blockdiag.xml b/scilab/modules/elementary_functions/help/en_US/elementarymatrices/blockdiag.xml
new file mode 100644 (file)
index 0000000..5a903ee
--- /dev/null
@@ -0,0 +1,244 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2008 - INRIA
+ * Copyright (C) 2013 - A. Khorshidi
+ * Copyright (C) 2012 - 2016 - Scilab Enterprises
+ * Copyright (C) 2019 - Samuel GOUGEON
+ *
+ * This file is hereby licensed under the terms of the GNU GPL v2.0,
+ * pursuant to article 5.3.4 of the CeCILL v.2.1.
+ * This file was originally licensed under the terms of the CeCILL v2.1,
+ * and continues to be available under such terms.
+ * For more information, see the COPYING file which you should have received
+ * along with this program.
+ *
+ -->
+<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink"
+          xmlns:svg="http://www.w3.org/2000/svg" xmlns:ns5="http://www.w3.org/1999/xhtml"
+          xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook"
+          xmlns:scilab="http://www.scilab.org" xml:id="blockdiag" xml:lang="en">
+    <refnamediv>
+        <refname>blockdiag</refname>
+        <refpurpose>
+            Creates a block diagonal matrix from provided arrays. Block diagonal system connection.
+        </refpurpose>
+    </refnamediv>
+    <refsynopsisdiv>
+        <title>Syntax</title>
+        <synopsis>r = blockdiag(a1,a2,...,an)</synopsis>
+    </refsynopsisdiv>
+    <refsection>
+        <title>Arguments</title>
+        <variablelist>
+            <varlistentry>
+                <term>ai</term>
+                <listitem>
+                    <para>
+                        Matrices of booleans, numbers, polynomials, rationals, or strings, of any size.
+                        Sparse matrices are accepted.
+                    </para>
+                    <para>
+                        subsystems (i.e. gains, or linear systems in state-space or transfer form).
+                    </para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>r</term>
+                <listitem>
+                    <para>
+                        Matrix with a1, a2, a3, ... on the diagonal. <varname>r</varname> is
+                        sparse when at least one of the <varname>ai</varname> inputs is sparse.
+                    </para>
+                </listitem>
+            </varlistentry>
+        </variablelist>
+    </refsection>
+    <refsection>
+        <title>Description</title>
+        <para>
+            Given the inputs <varname>A</varname>, <varname>B</varname> and <varname>C</varname>,
+            the output will have these matrices arranged on the diagonal:
+            <latex style="display">\begin{bmatrix} A \ \ 0 \ \ 0 \\ 0 \ \ B \ \ 0 \\ 0 \ \ 0 \ \ C \end{bmatrix}</latex>.
+        </para>
+        <para>
+            If all the input matrices are square, the output is known as a
+            <emphasis>block diagonal matrix</emphasis>.
+        </para>
+        <para>
+            If sub-systems are provided, <literal>blockdiag(..)</literal> provides the
+            block-diagonal system made with subsystems put in the main diagonal.
+            This can be used in particular for system interconnections.
+        </para>
+        <note><literal>blockdiag()</literal> can be overloaded.</note>
+    </refsection>
+    <refsection>
+        <title>Examples</title>
+        <para>
+            With numbers:
+        </para>
+        <programlisting role="example"><![CDATA[
+A = [1 0 ; 0 1]
+B = [3 4 5 ; 6 7 8]
+C = 7
+D = blockdiag(A, B, C)
+     ]]></programlisting>
+        <screen><![CDATA[
+--> D = blockdiag(A, B, C)
+ D  =
+   1.   0.   0.   0.   0.   0.
+   0.   1.   0.   0.   0.   0.
+   0.   0.   3.   4.   5.   0.
+   0.   0.   6.   7.   8.   0.
+   0.   0.   0.   0.   0.   7.
+]]></screen>
+        <para>
+            With booleans:
+        </para>
+        <programlisting role="example"><![CDATA[
+blockdiag([%T %T %T], [%T ; %F], [%T %F])
+     ]]></programlisting>
+        <screen><![CDATA[
+--> blockdiag([%T %T %T], [%T ; %F], [%T %F])
+ ans  =
+  T T T F F F
+  F F F T F F
+  F F F F F F
+  F F F F T F
+]]></screen>
+        <para>
+            With polynomials:
+        </para>
+        <programlisting role="example"><![CDATA[
+s = %s;
+blockdiag(s, [s^2 ; s^3], [1+s, 1-s^2 ; 4 s^4])
+     ]]></programlisting>
+        <screen><![CDATA[
+--> b = blockdiag(s, [s^2 ; s^3], [1+s, 1-s^2 ; 4 s^4])
+ b  =
+
+   s    0    0      0
+         2
+   0    s    0      0
+         3
+   0    s    0      0
+                        2
+   0    0    1 +s   1 -s
+                     4
+   0    0    4      s
+]]></screen>
+        <para>
+            With rationals:
+        </para>
+        <programlisting role="example"><![CDATA[
+s = %s;
+blockdiag([1/s 2*s/(4*s+3)], 1/(s-1)^2)
+     ]]></programlisting>
+        <screen><![CDATA[
+--> blockdiag([1/s 2*s/(4*s+3)], 1/(s-1)^2)
+ ans  =
+
+   1     2s     0
+   --  -------  --
+   s   3 + 4s   1
+
+   0   0            1
+   --  --       -----------
+                          2
+   1   1        1 - 2s + s
+]]></screen>
+        <para>
+            With some sparse input:
+        </para>
+        <programlisting role="example"><![CDATA[
+S = blockdiag([1 2], sparse([0 3 ; 4 0]), 5)
+full(S)
+     ]]></programlisting>
+        <screen><![CDATA[
+--> S = blockdiag([1 2], sparse([0 3 ; 4 0]), 5)
+ S  =
+(  4,  5) sparse matrix
+(  1,  1)     1.
+(  1,  2)     2.
+(  2,  4)     3.
+(  3,  3)     4.
+(  4,  5)     5.
+
+--> full(S)
+ ans  =
+   1.   2.   0.   0.   0.
+   0.   0.   0.   3.   0.
+   0.   0.   4.   0.   0.
+   0.   0.   0.   0.   5.
+]]></screen>
+        <para>
+            With some text:
+        </para>
+        <programlisting role="example"><![CDATA[
+blockdiag(["Scilab" "is"],"a",["scientific" ; "software"])
+     ]]></programlisting>
+        <screen><![CDATA[
+--> blockdiag(["Scilab" "is"], "a", ["scientific" ; "software"])
+ ans  =
+!Scilab  is                 !
+!            a              !
+!               scientific  !
+!               software    !
+]]></screen>
+        <para>
+            With mixed concatenable data types (see the page of brackets []):
+        </para>
+        <programlisting role="example"><![CDATA[
+blockdiag([%T %F], [-1 3], (1-%z)^2)
+     ]]></programlisting>
+        <screen><![CDATA[
+--> blockdiag([%T %F], [-1 3], (1-%z)^2)
+ ans  =
+
+   1    0    0    0    0
+
+   0    0   -1    3    0
+                               2
+   0    0    0    0    1 -2z +z
+]]></screen>
+        <para>
+            With some linear system:
+        </para>
+        <programlisting role="example"><![CDATA[
+s = poly(0,'s')
+blockdiag(rand(2,2), 1/(s+1), [1/(s-1);1/((s-2)*(s-3))])
+blockdiag(tf2ss(1/s), 1/(s+1), [1/(s-1);1/((s-2)*(s-3))])
+ ]]></programlisting>
+    </refsection>
+    <refsection role="see also">
+        <title>See also</title>
+        <simplelist type="inline">
+            <member>
+                <link linkend="diag">diag</link>
+            </member>
+            <member>
+                <link linkend="bdiag">bdiag</link>
+            </member>
+            <member>
+                <link linkend="repmat">repmat</link>
+            </member>
+            <member>
+                <link linkend="brackets">brackets</link>
+            </member>
+            <member>
+                <link linkend="feedback">feedback</link>
+            </member>
+        </simplelist>
+    </refsection>
+    <refsection role="history">
+        <title>History</title>
+        <revhistory>
+            <revision>
+                <revnumber>6.1.0</revnumber>
+                <revdescription>
+                    blockdiag() introduced.
+                </revdescription>
+            </revision>
+        </revhistory>
+    </refsection>
+</refentry>
diff --git a/scilab/modules/elementary_functions/help/ru_RU/elementarymatrices/blockdiag.xml b/scilab/modules/elementary_functions/help/ru_RU/elementarymatrices/blockdiag.xml
new file mode 100644 (file)
index 0000000..e3d4792
--- /dev/null
@@ -0,0 +1,248 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2008 - INRIA
+ * Copyright (C) 2013 - A. Khorshidi
+ * Copyright (C) 2012 - 2016 - Scilab Enterprises
+ * Copyright (C) 2019 - Samuel GOUGEON
+ *
+ * This file is hereby licensed under the terms of the GNU GPL v2.0,
+ * pursuant to article 5.3.4 of the CeCILL v.2.1.
+ * This file was originally licensed under the terms of the CeCILL v2.1,
+ * and continues to be available under such terms.
+ * For more information, see the COPYING file which you should have received
+ * along with this program.
+ *
+ -->
+<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink"
+          xmlns:svg="http://www.w3.org/2000/svg" xmlns:ns5="http://www.w3.org/1999/xhtml"
+          xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook"
+          xmlns:scilab="http://www.scilab.org" xml:id="blockdiag" xml:lang="ru">
+    <refnamediv>
+        <refname>blockdiag</refname>
+        <refpurpose>
+            Создаёт блочную диагональную матрицу из указанных массивов. Соединение диагональной 
+            системы блоков.
+        </refpurpose>
+    </refnamediv>
+    <refsynopsisdiv>
+        <title>Синтаксис</title>
+        <synopsis>r = blockdiag(a1,a2,...,an)</synopsis>
+    </refsynopsisdiv>
+    <refsection>
+        <title>Аргументы</title>
+        <variablelist>
+            <varlistentry>
+                <term>ai</term>
+                <listitem>
+                    <para>
+                        Матрицы логических значений, чисел, полиномов, рациональных или строковых
+                        значений любого размера. Принимаются разрежённые матрицы.
+                    </para>
+                    <para>
+                        Подсистемы (т.е. коэффициенты усиления, или линейные системы в 
+                        пространстве состояний или передаточной форме).
+                    </para>
+                </listitem>
+            </varlistentry>
+            <varlistentry>
+                <term>r</term>
+                <listitem>
+                    <para>
+                        Матрица с <literal>a1, a2, a3</literal>, ... по диагонали. 
+                        <varname>r</varname> является разрежённой, хотя бы одна из входных 
+                        <varname>ai</varname> разрёжённая.
+                    </para>
+                </listitem>
+            </varlistentry>
+        </variablelist>
+    </refsection>
+    <refsection>
+        <title>Описание</title>
+        <para>
+            Подав на вход <varname>A</varname>, <varname>B</varname> and <varname>C</varname>,
+            на выходе эти матрицы будут расставлены по диагонали:
+            <latex style="display">\begin{bmatrix} A \ \ 0 \ \ 0 \\ 0 \ \ B \ \ 0 \\ 0 \ \ 0 \ \ C \end{bmatrix}</latex>.
+        </para>
+        <para>
+            Если все входные матрицы квадратные, то выходная матрицы известна как блочная 
+            диагональная матрица <emphasis>block diagonal matrix</emphasis>.
+        </para>
+        <para>
+            Если указаны подсистемы, то <literal>blockdiag(..)</literal> выдаёт блочно-
+            диагональную систему, сделанную из подсистем, располженых на главной диагонали.
+            Это может быть использовано в частности для соединений системы.
+        </para>
+        <note><literal>blockdiag()</literal> может быть перегружена.</note>
+    </refsection>
+    <refsection>
+        <title>Примеры</title>
+        <para>
+            С числами:
+        </para>
+        <programlisting role="example"><![CDATA[
+A = [1 0 ; 0 1]
+B = [3 4 5 ; 6 7 8]
+C = 7
+D = blockdiag(A, B, C)
+     ]]></programlisting>
+        <screen><![CDATA[
+--> D = blockdiag(A, B, C)
+ D  =
+   1.   0.   0.   0.   0.   0.
+   0.   1.   0.   0.   0.   0.
+   0.   0.   3.   4.   5.   0.
+   0.   0.   6.   7.   8.   0.
+   0.   0.   0.   0.   0.   7.
+]]></screen>
+        <para>
+            С логическими значениями:
+        </para>
+        <programlisting role="example"><![CDATA[
+blockdiag([%T %T %T], [%T ; %F], [%T %F])
+     ]]></programlisting>
+        <screen><![CDATA[
+--> blockdiag([%T %T %T], [%T ; %F], [%T %F])
+ ans  =
+  T T T F F F
+  F F F T F F
+  F F F F F F
+  F F F F T F
+]]></screen>
+        <para>
+            С полиномами:
+        </para>
+        <programlisting role="example"><![CDATA[
+s = %s;
+blockdiag(s, [s^2 ; s^3], [1+s, 1-s^2 ; 4 s^4])
+     ]]></programlisting>
+        <screen><![CDATA[
+--> b = blockdiag(s, [s^2 ; s^3], [1+s, 1-s^2 ; 4 s^4])
+ b  =
+
+   s    0    0      0
+         2
+   0    s    0      0
+         3
+   0    s    0      0
+                        2
+   0    0    1 +s   1 -s
+                     4
+   0    0    4      s
+]]></screen>
+        <para>
+            С рациональными значениями:
+        </para>
+        <programlisting role="example"><![CDATA[
+s = %s;
+blockdiag([1/s 2*s/(4*s+3)], 1/(s-1)^2)
+     ]]></programlisting>
+        <screen><![CDATA[
+--> blockdiag([1/s 2*s/(4*s+3)], 1/(s-1)^2)
+ ans  =
+
+   1     2s     0
+   --  -------  --
+   s   3 + 4s   1
+
+   0   0            1
+   --  --       -----------
+                          2
+   1   1        1 - 2s + s
+]]></screen>
+        <para>
+            С некоторыми разрежёнными матрицами на входе:
+        </para>
+        <programlisting role="example"><![CDATA[
+S = blockdiag([1 2], sparse([0 3 ; 4 0]), 5)
+full(S)
+     ]]></programlisting>
+        <screen><![CDATA[
+--> S = blockdiag([1 2], sparse([0 3 ; 4 0]), 5)
+ S  =
+(  4,  5) sparse matrix
+(  1,  1)     1.
+(  1,  2)     2.
+(  2,  4)     3.
+(  3,  3)     4.
+(  4,  5)     5.
+
+--> full(S)
+ ans  =
+   1.   2.   0.   0.   0.
+   0.   0.   0.   3.   0.
+   0.   0.   4.   0.   0.
+   0.   0.   0.   0.   5.
+]]></screen>
+        <para>
+            С текстом:
+        </para>
+        <programlisting role="example"><![CDATA[
+blockdiag(["Scilab" "is"],"a",["scientific" ; "software"])
+     ]]></programlisting>
+        <screen><![CDATA[
+--> blockdiag(["Scilab" "is"], "a", ["scientific" ; "software"])
+ ans  =
+!Scilab  is                 !
+!            a              !
+!               scientific  !
+!               software    !
+]]></screen>
+        <para>
+            Со смешанными конкатенируемыми типами данных (см. справку по квадратным скобкам 
+            <literal>[]</literal>):
+        </para>
+        <programlisting role="example"><![CDATA[
+blockdiag([%T %F], [-1 3], (1-%z)^2)
+     ]]></programlisting>
+        <screen><![CDATA[
+--> blockdiag([%T %F], [-1 3], (1-%z)^2)
+ ans  =
+
+   1    0    0    0    0
+
+   0    0   -1    3    0
+                               2
+   0    0    0    0    1 -2z +z
+]]></screen>
+        <para>
+            С линейной системой:
+        </para>
+        <programlisting role="example"><![CDATA[
+s = poly(0,'s')
+blockdiag(rand(2,2), 1/(s+1), [1/(s-1);1/((s-2)*(s-3))])
+blockdiag(tf2ss(1/s), 1/(s+1), [1/(s-1);1/((s-2)*(s-3))])
+ ]]></programlisting>
+    </refsection>
+    <refsection role="see also">
+        <title>Смотрите также</title>
+        <simplelist type="inline">
+            <member>
+                <link linkend="diag">diag</link>
+            </member>
+            <member>
+                <link linkend="bdiag">bdiag</link>
+            </member>
+            <member>
+                <link linkend="repmat">repmat</link>
+            </member>
+            <member>
+                <link linkend="brackets">brackets</link>
+            </member>
+            <member>
+                <link linkend="feedback">feedback</link>
+            </member>
+        </simplelist>
+    </refsection>
+    <refsection role="history">
+        <title>История</title>
+        <revhistory>
+            <revision>
+                <revnumber>6.1.0</revnumber>
+                <revdescription>
+                    Введена <literal>blockdiag()</literal>.
+                </revdescription>
+            </revision>
+        </revhistory>
+    </refsection>
+</refentry>
diff --git a/scilab/modules/elementary_functions/macros/blockdiag.sci b/scilab/modules/elementary_functions/macros/blockdiag.sci
new file mode 100644 (file)
index 0000000..afb8403
--- /dev/null
@@ -0,0 +1,71 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) INRIA -
+//
+// Copyright (C) 2012 - 2016 - Scilab Enterprises
+// Copyright (C) 2019 - Samuel GOUGEON
+//
+// This file is hereby licensed under the terms of the GNU GPL v2.0,
+// pursuant to article 5.3.4 of the CeCILL v.2.1.
+// This file was originally licensed under the terms of the CeCILL v2.1,
+// and continues to be available under such terms.
+// For more information, see the COPYING file which you should have received
+// along with this program.
+
+function r = blockdiag(varargin)
+    //!
+    // Call overload ?
+    // ---------------
+    callOverload = %f
+    for i = 1:length(varargin)
+        v = varargin(i);
+        callOverload = callOverload | ..
+         ( and(type(v)<>[1 2 4 5 6 8 10]) & and(typeof(v)<>["rational" "state-space"]))
+        if callOverload
+            oname = "%" + typeof(v, "overload") + "_blockdiag"
+            if isdef(oname,"n")
+                execstr("r = " + oname + "(varargin(:));")
+                return
+            else
+                msg = _("Function not defined for given argument type(s),\n  Check arguments or define the overloading function %s().\n")
+                error(msprintf(msg, oname))
+            end
+        end
+    end
+    //
+    isss = %f;
+    for i = 1:length(varargin)
+        isss = isss | typeof(varargin(i))=="state-space"
+        if isss, break, end
+    end
+    withSparse = %f
+    for i = 1:length(varargin)
+        withSparse = withSparse | issparse(varargin(i))
+        if withSparse, break, end
+    end
+    r = varargin(1);
+    if withSparse then
+        r = sparse(r);
+    end
+    if type(r)==10 then
+        padd = emptystr
+    else
+        padd = zeros
+    end
+    [m1, n1] = size(r);
+    for k = 2:size(varargin)
+        ak = varargin(k)
+        [mk, nk] = size(ak);
+        if mk*nk > 0
+            if isss
+                r = [r, padd(m1, nk); padd(mk, n1), ak]
+            else
+                r(m1+mk, n1+nk) = ak($,$)     // array extension
+                if mk*nk > 1
+                    r(m1+1:m1+mk, n1+1:n1+nk) = ak
+                end
+            end
+            m1 = m1+mk
+            n1 = n1+nk
+        end
+    end
+endfunction
diff --git a/scilab/modules/elementary_functions/tests/unit_tests/blockdiag.tst b/scilab/modules/elementary_functions/tests/unit_tests/blockdiag.tst
new file mode 100644 (file)
index 0000000..1cd2ca8
--- /dev/null
@@ -0,0 +1,64 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2019 - Samuel GOUGEON
+//
+// This file is hereby licensed under the terms of the GNU GPL v2.0,
+// pursuant to article 5.3.4 of the CeCILL v.2.1.
+// This file was originally licensed under the terms of the CeCILL v2.1,
+// and continues to be available under such terms.
+// For more information, see the COPYING file which you should have received
+// along with this program.
+// ----------------------------------------------------------------------------
+
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+// <-- IMPOSED ENGLISH -->
+//
+// --------------------------
+// Unit tests for blockdiag()
+// --------------------------
+
+// Decimal numbers and encoded integers:
+R = [1 2];
+C = [3 ; 4]
+M = [5 6 ; 7 8];
+ref = [1,2,0,0,0;0,0,3,0,0;0,0,4,0,0;0,0,0,5,6;0,0,0,7,8];
+for it = [0 1 2 4 8 11 12 14 18]
+    b = blockdiag(iconvert(R,it),iconvert(C, it), iconvert(M,it));
+    assert_checkequal(b, iconvert(ref,it));
+end
+
+// Strings
+b = blockdiag(string(R), string(C), string(M));
+assert_checkequal(b, strsubst(string(ref),"0",""));
+
+// Booleans
+b = blockdiag([%T %T], [%T %T]', [%T %T ; %T %T], %T)
+T = %T; F = %F;
+ref = [T,T,F,F,F,F;F,F,T,F,F,F;F,F,T,F,F,F;F,F,F,T,T,F;F,F,F,T,T,F;F,F,F,F,F,T];
+assert_checkequal(b, ref);
+b = blockdiag(sparse([%T %T]), sparse([%T %T]'), sparse([%T %T ; %T %T]), sparse(%T));
+assert_checkequal(b, sparse(ref));
+b = blockdiag([%T %T], sparse([%T %T]'), [%T %T ; %T %T], sparse(%T));
+assert_checkequal(b, sparse(ref));
+
+// Polynomials
+z = %z;
+b = blockdiag([z 1-z^2], [1 3*z]', z.^[1 3 ; 2 4], z^5)
+ref = [ z,1-z^2,0*z,0*z,0*z,0*z;
+        0*z,0*z,1,0*z,0*z,0*z;
+        0*z,0*z,3*z,0*z,0*z,0*z;
+        0*z,0*z,0*z,z,z^3,0*z;
+        0*z,0*z,0*z,z^2,z^4,0*z;
+        0*z,0*z,0*z,0*z,0*z,z^5];
+assert_checkequal(b, ref);
+
+// Rationals
+b = blockdiag([1/z z/(1-z)], [3*z z^2]', (1+z)./z.^[1 3 ; 2 4], 1/z^5);
+ref =  [1,z,0*z,0*z,0*z,0*z;0*z,0*z,3*z,0*z,0*z,0*z;0*z,0*z,z^2,0*z,0*z,0*z;0*z,0*z,0*z,1+z,1+z,0*z;0*z,0*z,0*z,1+z,1+z,0*z;0*z,0*z,0*z,0*z,0*z,1] ./ [z,1-z,1,1,1,1;1,1,1,1,1,1;1,1,1,1,1,1;1,1,1,z,z^3,1;1,1,1,z^2,z^4,1;1,1,1,1,1,z^5];
+assert_checkequal(b, ref);
+
+// Errors
+msg = ["Function not defined for given argument type(s),"
+       "  Check arguments or define the overloading function %ip_blockdiag()."];
+assert_checkerror("blockdiag(1:$, 2:$)", msg);
index 262be7e..f2d945b 100644 (file)
@@ -237,6 +237,7 @@ _LaTeX_SAWTOOTH_f.xml_1.png=d2352f773be10a7110da96a1bf7f316d
 _LaTeX_STEP_FUNCTION.xml_1.png=7544adffd057978d0ddaed767ae05f25\r
 _LaTeX_assert_computedigits.xml_1.png=082a70de2c216b6eb1951a75720fdcfc\r
 _LaTeX_assert_computedigits.xml_2.png=27dba5ee1401d31d2106736651e99140\r
+_LaTeX_blockdiag.xml_1.png=26bcad469ac051064707c071f102456c\r
 _LaTeX_bvode.xml_1.png=7d919bf8f33698749d88e30e99c33d7c\r
 _LaTeX_bvode.xml_2.png=417a5301693b60807fa658e5ef9f9535\r
 _LaTeX_bvode.xml_3.png=7e3c241c2dec821bd6c6fbd314fe4762\r
diff --git a/scilab/modules/helptools/images/_LaTeX_blockdiag.xml_1.png b/scilab/modules/helptools/images/_LaTeX_blockdiag.xml_1.png
new file mode 100644 (file)
index 0000000..2bfb424
Binary files /dev/null and b/scilab/modules/helptools/images/_LaTeX_blockdiag.xml_1.png differ
index d9dfff6..b3bc0ea 100644 (file)
             </tr>
             <tr>
                 <td>
-                    <programlisting role="example"><![CDATA[
+                    <programlisting role="no-scilab-exec"><![CDATA[
 blkdiag
 ]]></programlisting>
                 </td>
                 <td>
                     <programlisting role="example"><![CDATA[
-sysdiag
+blockdiag
 ]]></programlisting>
                 </td>
             </tr>