# extraction

行列およびリストのエントリの展開

## 呼出し手順

                x(i)
                x(i,j)
                x(i,j,k,..)
                [...]=l(i)
                [...]=l(k1)...(kn)(i) または [...]=l(list(k1,...,kn,i))
                l(k1)...(kn)(i,j) または l(list(k1,...,kn,list(i,j))

## パラメータ

x

  任意の型の行列

l

  リスト変数

i,j, k

  添え字

k1,...kn

  添え字

## 説明

行列の場合

  `i`, `j`, `k`,.. は以下のようになります:

  正の要素を有する実数のスカラーまたはベクトルまたは行列.

    - `r=x(i,j)` は, 1 から`size(i,'*')`の `l`および 1 から `size(j,'*')`の `k`について `r(l,k)=x(int(i(l)),int(j(k)))`となるような 行列`r`を作成します.

      `i` (`j`) の 最大値は`size(x,1)` (`size(x,2)`)以下とする必要があります.

    - 1x1行列 `x`を指定した `r=x(i)`は, 1 から`size(i,1)`の`l`および 1 から `size(i,2)`の`k` について, `r(l,k)=x(int(i(l)),int(i(k)))` となるような 行列 `r` を構築します.

      この場合,全てのエントリが1に等しい場合にのみ, 添え字 `i`が有効です.

    - `x`を指定した行ベクトル`r=x(i)`は, 1から`size(i,'*')`の`l` について`r(l)=x(int(i(l)))`となるような 行ベクトル `r`を作成します. `i`の最大値が `size(x,'*')`以下とする必要があります.

    - 1つ以上の列を有する行列`x`を指定した `r=x(i)` は, `r(l)` (`l`は 1 から `size(i,'*')`) が `x`の列の結合により作成された 列ベクトルの エントリ`int(i(l))`を含むような 列ベクトル`r`を作成します.

      `i` の最大値は `size(x,'*')`以下である必要があります.

  記号 `:`

    `` は "全ての要素"を意味します.

    - `r=x(i,:)` は, 1から`size(i,'*')`の`l`, 1から`size(x,2)`の`k`について, `r(l,k)=x(int(i(l)),k))`となるような 行列 `r` を作成します.

    - `r=x(:,j)` は, 1から`size(r,1)`の`l`, 1から`size(j,'*')`の`k`について, `r(l,k)=x(l,int(j(k)))`となるような 行列 `r` を作成します.

    - `r=x(:)` は, `x`列の列結合により 列ベクトル`r`を作成します. これは,`matrix(x,size(x,'*'),1)`と等価です.

  論理値のベクトル

    添え字 (`i` または `j` ) が論理値のベクトルの場合,それぞれ `find(i)`または`find(j)` として解釈されます.

  多項式

    添え字 (`i` または `j` )が多項式のベクトルまたは 暗黙の多項式ベクトルの場合,それぞれ `horner(i,m)`または `horner(j,n)`と解釈されます. ただし,`m` および`n` は`x`の次元に関連します. この機能は全ての多項式に対して動作しますが, 可読性を確保するために, `$`に 多項式を使用することが推奨されます.

  2より大きな次元の行列(参照:ハイパー行列)の場合, 最も右の次元が1に等しくなると 次元が自動的に縮小されます.

list または tlist の場合

  指定された場合, `ki`は`l`データ構造 のサブリストのエントリへのパスを指定します. これにより,中間的なコピーをすることなく再帰的な展開が 可能になります. 命令は以下のようになります:

  `[...]=l(k1)...(kn)(i)`

  および

  `[...]=l(list(k1,...,kn,i))`

  は以下のように解釈されます:

  `lk1 = l(k1)``.. = ..` `lkn = lkn-1(kn)``[...] = lkn(i)` そして,`l(k1)...(kn)(i,j)` および

  `l(list(k1,...,kn,list(i,j))` 命令は 以下のように解釈されます: `lk1 = l(k1)` `.. = ..` `lkn = lkn-1(kn)` `lkn(i,j)` `i` および `j`については後述します. パスが複数のリストの要素を指す場合, この命令は,選択した要素と同じ数の左辺の引数を有する必要があります. しかし,展開構文を関数の中で使用した場合, リストの要素を返す入力の呼出し手順が 関数の呼び出し手順に追加されます.

  `l(list())` は `l`と同じであることに注意してください.

  i および j は以下のようになります :
    正の要素を有する実数のスカラーまたはベクトルまたは行列.

      `[r1,...rn]=l(i)` は リスト l から要素`i(k)`を展開し,これを 1から`size(i,'*')`までの `k` について `rk` に保存します.

    記号 `:`

      "全ての要素"を意味します.

    論理値のベクトル.

      `i` が論理値のベクトルの場合, `find(i)`と解釈されます.

    多項式.

      `i` が多項式のベクトルまたは 暗黙の多項式ベクトルの場合, `horner(i,m)`として解釈されます. ただし,`m=size(l)`です. この機能は全ての多項式に関して動作しますが, 可読性を良くするために,多項式を`$`の 中で使用することを推奨します.

  k1,..kn は以下のようになります. :
    実数の正のスカラー,

    多項式,

      は`horner(ki,m)`と解釈されます. ただし,`m`は対応するサブリストの大きさです.

    文字列

      サブリストのエントリ名に関連します.

## 注意

有理関数や状態空間線形システムのようにソフトウエアで作成される行列の型の場合, リストの要素の展開と区別できないため, `x(i)` 構文をベクトル要素の展開には使用できない可能性が あります. この場合, `x(1,j)` または `x(i,1)`構文を使用する必要があります.

## 例

    // 行列の場合
    a=[1 2 3;4 5 6]
    a(1,2)
    a([1 1],2)
    a(:,1)
    a(:,3:-1:1)
    a(1)
    a(6)
    a(:)
    a([%t %f %f %t])
    a([%t %f],[2 3])
    a(1:2,$-1)
    a($:-1:1,2)
    a($)
    //
    x='test'
    x([1 1;1 1;1 1])
    //
    b=[1/%s,(%s+1)/(%s-1)]
    b(1,1)
    b(1,$)
    b(2) // 分子
    // LIST または TLIST の場合
    l=list(1,'qwerw',%s)
    l(1)
    [a,b]=l([3 2])
    l($)
    x=tlist(l(2:3)) // ｌの末尾2要素を有する tlist を作成
    //
    dts=list(1,tlist(['x';'a';'b'],10,[2 3]));
    dts(2)('a')
    dts(2)('b')(1,2)
    [a,b]=dts(2)(['a','b'])

## 参照

- find
- horner
- parents