qr QR 分解

## 呼び出し手順

    [Q,R]=qr(X [,"e"])

                [Q,R,E]=qr(X [,"e"])

                [Q,R,rk,E]=qr(X [,tol])

## 引数

X

  実数または複素数の行列

tol

  非負の実数

Q

  正方直交またはユニタリ行列

R

  `X`と同じ次元の行列

E

  置換行列

rk

  整数 (`X`のQRランク)

## 説明

[Q,R] = qr(X)

  `X= Q*R`となるような `X`と同じ次元の 上三角行列`R`および直交(複素数の場合はユニタリ)行列 `Q`を出力します. `[Q,R] = qr(X,"e")`は次にように "エコノミーサイズ"で出力します: `X` が m行n列 (m > n)の場合, `Q`の最初のn列のみが `R`の最初のn行と同時に計算されます.

  `Q*R = X` から, 行列 `X`のk番目の列は, (係数 `R(1,k), ..., R(k,k)` を用いて) `Q`の最初のk列の線形結合で表されます. `Q`の最初のk列は,`X`の最初のk列 に広がる部分空間の直交基底を作成します. `X`の列`k`(すなわち, `X(:,k)` ) が`X`の最初の`p`列の線形結合の場合, エントリ`R(p+1,k), ..., R(k,k)`は 0 となります. この場合,`R`は上台形となります. `X` がランク`rk`を有する場合, 行 `R(rk+1,:), R(rk+2,:), ...` は 0 となります.

[Q,R,E] = qr(X)

  `X*E = Q*R`となるような (列)置換行列`E`, 降順の対角要素を有する上三角行列 `R`, 直交(またはユニタリ)`Q` を出力します. `rk`が`X`のランクの場合, `R`の主対角項に沿った 最初の`rk`個のエントリ, すなわち,`R(1,1), R(2,2), ..., R(rk,rk)`は 全て0以外となります. `[Q,R,E] = qr(X,"e")` は "エコノミーサイズ"で出力します: `X` が m行n列 (m > n)の場合, `Q`の最初のn列のみが `R`の最初のn行と同時に計算されます.

[Q,R,rk,E] = qr(X ,tol)

  `rk` = `X`のランクの推定値 を返します. すなわち, `rk`は, 指定した閾値`tol`より大きな `R`の対角要素の数となります.

[Q,R,rk,E] = qr(X)

  `rk` = `X`のランクの推定値 を返します. すなわち,`rk` は `tol=R(1,1)*%eps*max(size(R))`より大きな `R`の対角要素の数となります. `R`の条件数を用いる ランク計算型のQR分解については,`rankqr`を 参照してください.

## 例

    // QR factorization, generic case
    // X is tall (full rank)
    X=rand(5,2);[Q,R]=qr(X); [Q'*X R]
    //X is fat (full rank)
    X=rand(2,3);[Q,R]=qr(X); [Q'*X R]
    //Column 4 of X is a linear combination of columns 1 and 2:
    X=rand(8,5);X(:,4)=X(:,1)+X(:,2); [Q,R]=qr(X); R, R(:,4)
    //X has rank 2, rows 3 to $ of R are zero:
    X=rand(8,2)*rand(2,5);[Q,R]=qr(X); R
    //Evaluating the rank rk: column pivoting ==> rk first
    //diagonal entries of R are non zero :
    A=rand(5,2)*rand(2,5);
    [Q,R,rk,E] = qr(A,1.d-10);
    norm(Q'*A-R)
    svd([A,Q(:,1:rk)])    //span(A) =span(Q(:,1:rk))

## 参照

- rankqr
- rank
- svd
- rowcomp
- colcomp

## 使用する関数

qr 分解はLapack ルーチン DGEQRF, DGEQPF, DORGQR (実数行列)および ZGEQRF, ZGEQPF, ZORGQR (複素数の場合) に基づいています.