lu ピボット選択付きのLU 分解

## 呼び出し手順

    [L,U]= lu(A)

                [L,U,E]= lu(A)

## 引数

A

  実数または複素数の行列 (m x n).

L

  実数または複素数の行列 (m x min(m,n)).

U

  実数または複素数の行列 (min(m,n) x n ).

E

  a (n x n) 置換行列.

## 説明

`[L,U]= lu(A)` は, `U`を上三角行列, `L`を何らかの特別な構造を持たない一般的な行列として, `A = L*U` となるような 2つの行列 `L` および `U` を出力します. 実際は,行列`A`は`E*A=B*U` のように分解されます. ただし, 行列`B`は下三角行列, 行列`L`は`L=E'*B`から計算されます.

`A` がランク `k`を有している場合, `U`の行 `k+1` から `n` までは 0　となります.

`[L,U,E]= lu(A)` は, 上三角行列`U`および 置換行列を `E`とした下三角行列 `E*L`, により`E*A = L*U`となるような 3つの行列 `L`, `U` および `E`を出力します.

`A` が実数行列の場合, 関数`lufact` および `luget`を 用いることにより, 置換行列を得ることができます. `A`がフルランクでない場合,行列 `L` の列圧縮も得ることができる.

## 例 #1

以下の例では,大きさ4のヒルバート行列を作成し, A=LU と分解します. 行列 L は下三角行列ではないことに注意してください. 下三角行列Lを取得するには, 出力引数 E を Scilab に指定する必要があります.

    a = testmatrix("hilb",4);
    [l,u]=lu(a)
    norm(l*u-a)

## 例 #2

以下の例では,大きさ4のヒルバート行列を作成し, EA=LU と分解します. 行列 L は下三角行列であることに注意してください.

    a = testmatrix("hilb",4);
    [l,u,e]=lu(a)
    norm(l*u-e*a)

## 例 #3

以下の例では, lufact および luget 関数を使用する 方法を示しています.

    a=rand(4,4);
    [l,u]=lu(a)
    norm(l*u-a)
    [h,rk]=lufact(sparse(a))
    [P,L,U,Q]=luget(h);
    ludel(h)
    P=full(P);
    L=full(L);
    U=full(U);
    Q=full(Q);
    norm(P*L*U*Q-a)

## 参照

- lufact
- luget
- lusolve
- qr
- svd

## 使用する関数

lu 分解 Lapack ルーチン DGETRF (実数行列の場合) および ZGETRF (複素数の場合) に基づいています.