<?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:mml="http://www.w3.org/1998/Math/MathML"
          xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org"
          xml:lang="ru" xml:id="insertion">
    <refnamediv>
        <refname>вставка</refname>
        <refpurpose>
            частичное присвоение или модификация значения переменной
        </refpurpose>
    </refnamediv>
    <refnamediv xml:id="assignation">
        <refname>присвоение</refname>
        <refpurpose>частичное присвоение значения переменной</refpurpose>
    </refnamediv>
    <refsynopsisdiv>
        <title>Синтаксис</title>
        <synopsis>
            x(i,j)=a
            x(i)=a
            l(i)=a
            l(k1)...(kn)(i)=a или l(list(k1,...,kn,i))=a
            l(k1)...(kn)(i,j)=a или l(list(k1,...,kn,list(i,j))=a
        </synopsis>
    </refsynopsisdiv>
    <refsection>
        <title>Аргументы</title>
        <variablelist>
            <varlistentry>
                <term>x</term>
                <listitem>
                    <para>матрица любого типа (constant, sparse, polynomial,...)</para>
                </listitem>
            </varlistentry>
            <varlistentry>
                <term>l</term>
                <listitem>
                    <para>list</para>
                </listitem>
            </varlistentry>
            <varlistentry>
                <term>i,j</term>
                <listitem>
                    <para>индексы</para>
                </listitem>
            </varlistentry>
            <varlistentry>
                <term>k1,...kn</term>
                <listitem>
                    <para>индексы с целочисленными значениями</para>
                </listitem>
            </varlistentry>
            <varlistentry>
                <term>a</term>
                <listitem>
                    <para>новое значение элемента</para>
                </listitem>
            </varlistentry>
        </variablelist>
    </refsection>
    <refsection>
        <title>Описание</title>
        <refsect3>
            <title>Для матриц</title>
            <para>
              Если <literal>x</literal> является матрицей, то индексы <literal>i</literal> и <literal>j</literal> могут быть:
            </para>
            <variablelist>
              <varlistentry>
                <term>вещественными скалярами или векторами или матрицами</term>
                <listitem>
                  <para>
                    В этом случае значения, указанные как индексы, должны быть положительными и учитывается лишь их целая часть.
                  </para>
                  <itemizedlist>
                    <listitem>
                      <para>
                        Если <literal>a</literal> является матрицей с размерами
                        <literal>(size(i,'*'),size(j,'*'))</literal>, то
                        <literal>x(i,j)=a</literal> возвращает новую матрицу <literal>x</literal> такую, как
                        <literal>x(int(i(l)),int(j(k)))=a(l,k)</literal> для
                        <literal>l</literal> от 1 до
                        <literal>size(i,'*')</literal> и <literal>k</literal> от
                        1 до <literal>size(j,'*')</literal>, другие изначальные элементы  <literal>x</literal>
                        остаются неизменными.
                      </para>
                    </listitem>
                    <listitem>
                      <para>
                        Если <literal>a</literal> является скаляром, то
                        <literal>x(i,j)=a</literal> возвращает новую матрицу <literal>x</literal> такую, как
                        <literal>x(int(i(l)),int(j(k)))=a</literal> для
                        <literal>l</literal> от 1 до
                        <literal>size(i,'*')</literal> и <literal>k</literal> от
                        1 до <literal>size(j,'*')</literal>, другие изначальные элементы  <literal>x</literal>
                        остаются неизменными.
                      </para>
                    </listitem>
                    <listitem>
                      <para>
                        Если максимальное значение <literal>i</literal> или <literal>j</literal>
                        превосходит соответствующие размеры матрицы <literal>x</literal>, то
                        массив <literal>x</literal> сначала расширяется до требуемых размеров нулевыми
                        элементами для стандартных матриц, символьными строками нулевой длины для строковых матриц
                        и значениями "ложь" для матриц логических значений.
                      </para>
                    </listitem>
                    <listitem>
                      <para>
                        <literal>x(i,j)=[]</literal> удаляет строки, определённые через
                        <literal>i</literal>, если <literal>j</literal> совпадает со всеми столбцами
                        <literal>x</literal> или удаляет столбцы, определённые через
                        <literal>j</literal>, если <literal>i</literal> совпадает со всеми строками
                        <literal>x</literal>. В других случаях <literal>x(i,j)=[]</literal>
                        формирует ошибку.
                      </para>
                    </listitem>
                    <listitem>
                      <para>
                        <literal>x(i)=a</literal>, где <literal>a</literal> -- вектор, возвращает
                        новую матрицу <literal>x</literal>, такую что
                        <literal>x(int(i(l)))=a(l)</literal> для <literal>l</literal> от 1 до
                        <literal>size(i,'*')</literal>, другие изначальные элементы <literal>x</literal>
                        являются неизменными.
                      </para>
                    </listitem>
                    <listitem>
                      <para>
                        <literal>x(i)=a</literal>, где <literal>a</literal> -- скаляр, возвращает
                        новую матрицу <literal>x</literal>, такую что
                        <literal>x(int(i(l)))=a</literal> для <literal>l</literal> от 1 до
                        <literal>size(i,'*')</literal>, другие изначальные элементы <literal>x</literal>
                        являются неизменными.
                      </para>
                      <para>
                        Если максимальное значение <literal>i</literal> превосходит
                        <literal>size(x,1)</literal>, то <literal>x</literal>  сначала расширяется до
                        требуемого размера нулевыми элементами для стандартных матриц, символьными строками нулевой длины для строковых матриц
                        и значениями "ложь" для матриц логических значений.
                      </para>
                      <variablelist>
                        <varlistentry>
                          <term>если</term>
                          <listitem>
                            <para>
                              <literal>x</literal> является скаляром (1x1)
                            </para>
                            <para>
                              матрица <literal>a</literal> может быть вектор-строкой (соответственно вектор-столбцом) размером
                              <literal>size(i,'*')</literal>. Результирующая матрица
                              <literal>x</literal> является вектором-строкой (соответственно вектор-столбцом);
                            </para>
                          </listitem>
                        </varlistentry>
                        <varlistentry>
                          <term>если</term>
                          <listitem>
                            <para>
                              <literal>x</literal> является вектор-строкой
                            </para>
                            <para>
                              вектор <literal>a</literal> должен быть вектор-строкой размером <literal>size(i,'*')</literal>;
                            </para>
                          </listitem>
                        </varlistentry>
                        <varlistentry>
                          <term>если</term>
                          <listitem>
                            <para>
                              <literal>x</literal> является вектор-столбцом
                            </para>
                            <para>
                              вектор <literal>a</literal> должен быть вектор-столбцом размером <literal>size(i,'*')</literal>;
                            </para>
                          </listitem>
                        </varlistentry>
                        <varlistentry>
                          <term>если</term>
                          <listitem>
                            <para>
                              <literal>x</literal> в общем виде
                            </para>
                            <para>
                              матрица <literal>a</literal> должна быть вектор-строкой или вектор-столбцом
                              размером <literal>size(i,'*')</literal> и максимальное значение
                              <literal>i</literal> не может превосходить
                              <literal>size(x,'*')</literal>.
                            </para>
                          </listitem>
                        </varlistentry>
                      </variablelist>
                    </listitem>
                    <listitem>
                      <para>
                        <literal>x(i)=[]</literal> удаляет элементы, определённые через <literal>i</literal>.
                      </para>
                    </listitem>
                  </itemizedlist>
                </listitem>
              </varlistentry>
              <varlistentry>
                <term>символом "двоеточие"</term>
                <listitem>
                  <para>
                    Символ двоеточие <literal>:</literal> означает "все элементы".
                  </para>
                  <itemizedlist>
                    <listitem>
                      <para>
                        <literal>x(i,:)=a</literal> интерпретируется как
                        <literal>x(i,1:size(x,2))=a</literal>
                      </para>
                    </listitem>
                    <listitem>
                      <para>
                        <literal>x(:,j)=a</literal> интерпретируется как
                        <literal>x(1:size(x,1),j)=a</literal>
                      </para>
                    </listitem>
                    <listitem>
                      <para>
                        <literal>x(:)=a</literal> возвращает в <literal>x</literal>
                        матрицу <literal>a</literal>, элементы которой переставлены в соответсвии
                        с размерами <literal>x</literal>. Размер <literal>size(x,'*')</literal>
                        должен быть равен размеру <literal>size(a,'*')</literal>.
                      </para>
                    </listitem>
                  </itemizedlist>
                </listitem>
              </varlistentry>
              <varlistentry>
                <term>векторами логических значений</term>
                <listitem>
                  <para>
                    Если индекс (<literal>i</literal> или <literal>j</literal>) задан в виде
                    вектора логических значений, то он интерпретируется как
                    <literal>find(i)</literal> или, соответственно, <literal>find(j)</literal>.
                  </para>
                </listitem>
              </varlistentry>
              <varlistentry>
                <term>полиномами</term>
                <listitem>
                  <para>
                    Если индекс (<literal>i</literal> или <literal>j</literal>) задан в виде
                    полиномов или в виде неявного вектора полиномов, то он интерпретируется как
                    <literal>horner(i,m)</literal> или, соответственно,
                    <literal>horner(j,n)</literal>, где <literal>m</literal> и
                    <literal>n</literal> связаны с размерами <literal>x</literal>.
                    Даже если это работает для всех полиномов, рекомендуется использовать символ
                    <literal>$</literal> для удобочитаемости.
                  </para>
                </listitem>
              </varlistentry>
            </variablelist>
        </refsect3>
        <refsect3>
            <title>Случай простых списков или типизированных списков (tlist)</title>
            <itemizedlist>
              <listitem>
                <para>
                  Если они имеются в наличии, то <literal>ki</literal> указывают путь до элемента подсписка
                  структуры данных <literal>l</literal>. Они позволяются рекурсивную вставку без
                  промежуточных копий. Инструкции <literal>l(k1)...(kn)(i)=a</literal>
                  и <literal>l(list(k1,...,kn,i)=a)</literal> интерпретируются следующим образом:
                </para>
                <para>
                  <literal>lk1 = l(k1)</literal>
                </para>
                <para>
                  <literal> ..  = ..  </literal>
                </para>
                <para>
                  <literal>lkn = lkn-1(kn)</literal>
                </para>
                <para>
                  <literal>lkn(i) = a</literal>
                </para>
                <para>
                  <literal>lkn-1(kn) = lkn</literal>
                </para>
                <para>
                  <literal> ..  = ..  </literal>
                </para>
                <para>
                  <literal>l(k1) = lk1</literal>
                </para>
                <para>
                  А инструкции <literal>l(k1)...(kn)(i,j)=a</literal> и  <literal>l(list(k1,...,kn,list(i,j))=a</literal>
                  интерпретируется как:
                </para>
                <para>
                  <literal>lk1 = l(k1)</literal>
                </para>
                <para>
                  <literal> ..  = ..  </literal>
                </para>
                <para>
                  <literal>lkn = lkn-1(kn)</literal>
                </para>
                <para>
                  <literal>lkn(i,j) = a</literal>
                </para>
                <para>
                  <literal>lkn-1(kn) = lkn</literal>
                </para>
                <para>
                  <literal> ..  = ..  </literal>
                </para>
                <para>
                  <literal>l(k1)= lk1</literal>
                </para>
              </listitem>
              <listitem>
                <para>
                  <literal>i</literal> может быть:
                </para>
                <itemizedlist>
                  <listitem>
                    <para>
                      вещественным неотрицательным скаляром. <literal>l(0)=a</literal>
                      добавляет элемент к списку "слева". <literal>l(i)=a</literal>
                      присваивает элементу <literal>i</literal> списка  <literal>l</literal>
                      значение <literal>a</literal>. Если <literal>i&gt;size(l)</literal>, то
                      <literal>l</literal> сначала расширяется  элементами нулевой длины (неопределённые).
                      <literal>l(i)=null()</literal> удаляет <literal>i</literal>-тый элемент из списка.
                    </para>
                  </listitem>
                  <listitem>
                    <para>
                      полиномом.  Если <literal>i</literal> является полиномом, то он интерпретируется как
                      <literal>horner(i,m)</literal>, где <literal>m=size(l)</literal>.
                      Даже если это работает для всех полиномов, рекомендуется использовать символ
                      <literal>$</literal> для удобочитаемости.
                    </para>
                  </listitem>
                </itemizedlist>
              </listitem>
              <listitem>
                <para>
                  <literal>k1,..kn</literal> могут быть:
                </para>
                <itemizedlist>
                  <listitem>
                    <para>
                      вещественным положительным скаляром;
                    </para>
                  </listitem>
                  <listitem>
                    <para> полиномом, интерпретируемым как
                      <literal>horner(ki,m)</literal>, где <literal>m</literal> является
                      соответствующим размером подсписка;
                    </para>
                  </listitem>
                  <listitem>
                    <para>
                      символьной строкой, связанной с именем элемента подсписка.
                    </para>
                  </listitem>
                </itemizedlist>
              </listitem>
            </itemizedlist>
        </refsect3>
        <refsect3>
            <title>Примечания</title>
            <para>
                Для программно формируемых типов матриц, таких, как рациональные функции
                и линейные системы пространства состояний, синтаксис <literal>x(i)</literal>
                нельзя использовать для вставки элементов вектора из-за путаницы со вставкой
                элемента списка. Должен использоваться синтаксис <literal>x(1,j)</literal>
                или <literal>x(i,1)</literal> .
            </para>
        </refsect3>
    </refsection>
    <refsection>
        <title>Примеры</title>
        <para>
            В СЛУЧАЕ МАТРИЦЫ
        </para>
        <programlisting role="example"><![CDATA[
a = [1 2 3 ; 4 5 6]
a(1,2) = 10
a([1 1],2) = [-1 ; -2]
a(:,1) = [8 ; 5]
a(1,3:-1:1) = [77 44 99]
a(1) = %s
a(6) = %s + 1
a(:) = 1:6
a([%t %f],1) = 33
a(1:2,$-1) = [2 ; 4]
a($:-1:1,1) = [8 ; 7]
a($) = 123
//
x = 'test'
x([4 5]) = ['4','5']
//
b = [1/%s, (%s+1)/(%s-1)]
b(1,1) = 0
b(1,$) = b(1,$) + 1
b(2) = [1 2] // числитель
     ]]></programlisting>
        <para>
            в случае LIST или TLIST
        </para>
        <programlisting role="example"><![CDATA[
l = list(1,'qwerw',%s)
l(1) = 'Changed'
l(0) = 'Added'
l(6) = ['one more' ; 'added']
//
//
dts = list(1, tlist(['x';'a';'b'],10,[2 3]));
dts(2).a = 33
dts(2)('b')(1,2) = -100
     ]]></programlisting>
    </refsection>
    <refsection role="see also">
        <title>Смотрите также</title>
        <simplelist type="inline">
            <member>
                <link linkend="extraction">выделение</link>
            </member>
            <member>
                <link linkend="colon">двоеточие</link>
            </member>
            <member>
                <link linkend="find">find</link>
            </member>
            <member>
                <link linkend="horner">horner</link>
            </member>
            <member>
                <link linkend="parentheses">круглые скобки</link>
            </member>
        </simplelist>
    </refsection>
</refentry>
