18.3 Matrix Factorizations

Last-modified: 2025-04-03 (木) 20:24:17

18.3 行列の因数分解

: R = chol (A)

: [R, p] = chol (A)

: [R, p, Q] = chol (A)

: [R, p, Q] = chol (A, "vector")

: [L, …] = chol (…, "lower")

: [R, …] = chol (…, "upper")

実対称または複素エルミート正定値行列Aの上コレスキー因子Rを計算します。

上コレスキー因子Rは行列Aの上三角部分を使って計算され、次のように定義される

R' * R = A.

cholオプションフラグを使用して呼び出した場合"upper"も同様の動作になります。対照的に、オプション"lower"フラグを使用すると、 行列Acholの下三角部分を使用して計算された下三角分解が返されます。

L * L' = A.

出力引数を 1 つ指定して呼び出されたchol場合、行列Aが正定値でない場合は失敗します。行列Aが実対称または複素エルミートでない場合は、フラグが指定されると、下三角部分は上三角部分の (複素共役) 転置とみなされ、その逆も成り立つことに注意してください"lower"。

2 つ以上の出力引数pで呼び出され、行列 Aが正定値であり、失敗しないかどうかを示します。pcholの値がゼロの場合、行列Aは正定値であり、R は 因数分解を示します。それ以外の場合、p は正の値になります。

3つの出力引数で呼び出された場合、行列Aは疎行列でなければならず、分解の前に疎行列Aに行/列の置換が適用されます 。つまり、Rは次のような 分解です 。A(Q,Q)

R' * R = Q' * A * Q.

スパース性保存順列は通常行列として返されます。ただし、オプションのフラグを指定すると"vector"、Qは次のベクトルとして返されます。

R' * R = A(Q, Q).

一般に、下三角因数分解は疎行列の場合に大幅に高速になります。

See also: hess, lu, qr, qz, schur, svd, ichol, cholinv, chol2inv, cholupdate, cholinsert, choldelete, cholshift.

: Ainv = cholinv (A)

コレスキー分解を使用して 対称正定値行列Aの逆行列を計算します。

See also: chol, chol2inv, inv.

: Ainv = chol2inv (R)

対称正定値正方行列をそのコレスキー分解Rから逆行列化します。

R は正の対角要素を持つ上三角行列である必要がある ことに注意してください。は提供しますが、 を使用するよりもはるかに高速です。 chol2inv (U)inv (R'*R)inv

See also: chol, cholinv, inv.

: [R1, info] = cholupdate (R, u, op)

コレスキー分解を更新またはダウンデートします。

上三角行列Rと列ベクトルuが与えられたとき、次の式を満たす別の上三角行列R1 を求めよ。

R1’*R1 = R’*R + u*u’ if op is "+"
R1’*R1 = R’*R - u*u’ if op is "-"

opが の場合"-"、情報は に設定されます

0 if the downdate was successful,

1 if R’*R - u*u’ is not positive definite,

2 if R is singular.
infoが存在しない場合は、ケース 1 および 2 でエラー メッセージが出力されます。

See also: chol, cholinsert, choldelete, cholshift.

: R1 = cholinsert (R, j, u)

: [R1, info] = cholinsert (R, j, u)

元の因数分解された行列に挿入する行または列を指定して、コレスキー分解を更新します。

実対称または複素エルミート正定値行列A = R '* R、R上三角の Cholesky 分解が与えられた場合、 A1 の Cholesky 分解を返します 。ここで、 A1(p,p) = A 、 A1(:,j) = A1(j,:)' = u および p = [1:j-1,j+1:n+1] です。u(j) は 正でなければなりません。

戻ると、情報は次のように設定されます

0 if the insertion was successful,

1 if A1 is not positive definite,

2 if R is singular.
infoが存在しない場合は、ケース 1 および 2 でエラー メッセージが出力されます。

See also: chol, cholupdate, choldelete, cholshift.

: R1 = choldelete (R, j)

元の因数分解行列から削除する行または列を指定して、コレスキー分解を更新します。

実対称または複素エルミート正定値行列A = R '* R、R 上三角の Cholesky 分解が与えられた場合、 A(p,p) の Cholesky 分解を返します。ここで、 p = [1:j-1,j+1:n+1] です。

See also: chol, cholupdate, cholinsert, cholshift.

: R1 = cholshift (R, i, j)

元の因数分解行列でシフトする列の範囲を指定して、コレスキー分解を更新します。

実対称または複素エルミート正定値行列A = R '* R、R上三角の Cholesky 分解が与えられた場合、 A (p,p) の Cholesky 分解を返します 。ここで、 p は、 i < jの場合 、またはj < iの場合の順列です。

p = [1:i-1, shift(i:j, 1), j+1:n] if i < j
か
p = [1:j-1, shift(j:i,-1), i+1:n] if j < i.

See also: chol, cholupdate, cholinsert, choldelete.

: H = hess (A)

: [P, H] = hess (A)

行列Aのヘッセンベルク分解を計算します。

ヘッセンベルク分解は、 Pが正方ユニタリ行列 ( 、複素共役転置を使用)、Hが上ヘッセンベルク行列 ( ) である場合に成ります。 P * H * P' = AP' * P = IH(i, j) = 0 forall i > j+1)

ヘッセンベルク分解は通常、固有値計算の最初のステップとして使用されますが、他の用途もあります (Golub、Nash、Van Loan 著『IEEE Transactions on Automatic Control』、1979 年を参照)。

See also: eig, chol, lu, qr, qz, schur, svd.

: [L, U] = lu (A)

: [L, U, P] = lu (A)

: [L, U, P, Q] = lu (S)

: [L, U, P, Q, R] = lu (S)

: […] = lu (S, thresh)

: y = lu (…)

: […] = lu (…, "vector")

Aの LU 分解を計算します。

Aがフルの場合はLAPACKのサブルーチンが使用され、 Aがスパースの場合はUMFPACKが使用されます。

結果は、オプションの戻り値Pに従って、並べ替えられた形式で返されます。たとえば、行列 が与えられた場合A = [1, 2; 3, 4]、

[ L , U , P ] = lu ( A )
以下を返します
L =
 1.00000  0.00000
 0.33333  1.00000
U =
 3.00000  4.00000
 0.00000  0.66667
P =
 0  1
 1  0

行列は正方である必要はありません。

2 つまたは 3 つの出力引数とスパース入力行列で呼び出された場合、 luスパース性を維持する列の置換は実行されません。4 番目の出力引数で呼び出された場合、スパース性を維持する列の変換Qが返されます 。これは、スパース入力行列で 呼び出す場合に推奨される方法です 。P * A * Q = L * Ulu

5 番目の出力引数とスパース入力行列で呼び出され、入力行列に対して lu スケーリング係数Rを使用して になるようにします。これにより、通常、よりスパースで安定した因数分解が実現されます。 P * (R \ A) * Q = L * U

ピボットしきい値を定義する 追加の入力引数threshを指定できます。 thresh はスカラーにすることができ、その場合、対称および非対称の両方のケースでUMFPACKピボット許容値を定義します。 threshが 2 要素ベクトルの場合、最初の要素は非対称UMFPACK ピボット戦略のピボット許容値を定義し、2 番目の要素は対称戦略のピボット許容値を定義します。デフォルトでは、で定義された値spparms([0.1, 0.001]) が使用されます。

文字列引数 が与えられると"vector"、PとQluの値をベクトル値として返します。完全な行列の場合、、 および となります。 A(P,:) = L * UR(P,:) * A(:,Q) = L * U

出力引数が 2 つの場合、上三角行列と下三角行列の並べ替えられた形式を返します。出力引数yが 1 つの場合、 LAPACKルーチンによって返される行列 が返されます。入力行列がスパースの場合、行列LはUに埋め込まれ、完全な場合と同様の戻り値が得られます。完全な行列とスパース行列の両方で、は並べ替え情報を失います。 A = L * Ulu

See also: luupdate, ilu, chol, hess, qr, qz, schur, svd.

: [L, U] = luupdate (L, U, x, y)

: [L, U, P] = luupdate (L, U, P, x, y)

実数または複素行列 A = L * U(L は 下側単位台形、 U は上側台形)の LU 分解が与えられた場合、 A + x * y .' の LU 分解を返します。ここで、xとyは列ベクトル(ランク 1 更新)または列数が等しい行列(ランク k 更新)です。

オプションとして、行置換(ピボット)行列Pを指定して行ピボット更新を使用することもできます。その場合、更新された置換行列が返されます。L、U、Pが次のようにして得られるピボット LU 分解である場合に注意してくださいlu。

[L, U, P] = lu (A);
の因数分解は次のように得られる。 A+x*y.'
[L1, U1] = lu (L, U, P*x, y)
か
[L1, U1, P1] = lu (L, U, P, x, y)

最初の形式では、高速ですが安定性の低い、ピボットされていないアルゴリズムが使用されます。2 番目の形式では、より安定している、より低速のピボットされたアルゴリズムが使用されます。

行列の場合は、ランク 1 更新のシーケンスとして実行されます。したがって、k が十分に大きい場合は、因数分解を最初から再計算する方が高速かつ正確になります。

See also: lu, cholupdate, qrupdate.

: [Q, R] = qr (A)

: [Q, R, P] = qr (A)

: X = qr (A) # non-sparse A

: R = qr (A) # sparse A

: X = qr (A, B) # sparse A

: [C, R] = qr (A, B)

: […] = qr (…, 0)

: […] = qr (…, "econ")

: […] = qr (…, "vector")

: […] = qr (…, "matrix")

標準のLAPACK サブルーチン を使用して、 Aの QR 分解を計算します。

QR因数分解は

Q * R = A

ここで、Qは直交行列、Rは上三角行列です。
例えば、行列 が与えられた場合A = [1, 2; 3, 4]、

[Q, R] = qr (A)
以下を返します
Q =
 -0.31623  -0.94868
 -0.94868   0.31623
R =
 -3.16228  -4.42719
  0.00000  -0.63246
これらを掛け合わせると元の行列が返される
Q * R
 ⇒
    1.0000   2.0000
    3.0000   4.0000

単一の戻り値のみが要求された場合、 AがスパースであればR、 Aがフルであれ ばXになります。(注: ほとんどのコマンドとは異なり、複数の値が要求された場合、単一の戻り値は最初の戻り値ではありません。) R = triu (X)

3番目の出力Pが要求された場合、qr置換QR分解を計算する。

Q * R = A * P

ここで、 Qは直交行列、Rは上三角行列、 Pは順列行列です。

Aが稠密である場合、置換 QR 分解には、Rの対角要素が大きさの降順で順序付けられるという追加の特性があります。言い換えると、最大から最小の順に順序付けられます。 abs (diag (R))

Aがスパースの場合、 PはAの列のフィル削減順序です。その場合、Rの対角要素は大きさの降順では順序付けられません。

例えば、行列 が与えられた場合A = [1, 2; 3, 4]、

[Q, R, P] = qr (A)
以下を返します
Q =
 -0.44721  -0.89443
 -0.89443   0.44721
R =
 -4.47214  -3.13050
  0.00000   0.44721
P =
  0  1
  1  0

入力行列Aがスパースである場合、スパース QR 分解はSPQRまたはCXSPARSEを使用して計算されます(たとえば、SPQRが利用できない場合)。行列Q は一般に完全な行列であるため、戻り値R を1 つだけ要求することをお勧めします。その場合、計算ではQの構築が回避され、 となるスパースRが返されます。 R = chol (A' * A)

Aが密な場合、追加の行列Bが提供され、2つの戻り値が要求され、Cqrが返されます。ここで、 です 。これにより、 の最小二乗近似を次のように計算できます。 C = Q' * BA \ B

[C, R] = qr (A, B)
X = R \ C

Aが疎な MxN 行列で、追加の行列Bが指定されている場合、戻り値は 1 つまたは 2 つ可能です。戻り値Xが 1 つ 要求され、M < N の場合、X はの最小 2 ノルム解です 。M >= N の場合、X はの最小二乗近似値です 。戻り値が 2 つ要求されている場合、CとR は密な場合と同じ意味を持ちます ( Cは密で、Rは疎です)。戻りパラメータが 1 つのバージョンの方がメモリ使用量が少なく、ランク不足の行列をより適切に処理できるため、推奨されます。 A \ BA \ B

最後の引数が文字列の場合"vector"、P は順列行列ではなく、順列ベクトル( Aの列)になります。この場合、定義関係は次のようになります。

Q * R = A(:, P)

ただし、デフォルトでは順列行列が返され、これは"matrix"の最終引数を使用して明示的に指定できます。

最後の引数がスカラー 0 または文字列 の場合"econ"、エコノミー因数分解が返されます。元の行列Aのサイズが MxN で、 M > N の場合、エコノミー因数分解では、Rの N 行とQの N 列のみが計算され、 Rのゼロは省略されます。 M ≤ N の場合、エコノミー因数分解と標準因数分解に違いはありません。エコノミー因数分解を計算し、Aが密である場合、出力P は常に行列ではなくベクトルになります。A が疎である場合、出力Pは疎順列行列になります。

背景:QR分解は最小二乗問題の解決に応用されている。

min norm (A*x - b)

過剰決定方程式系の場合(つまり、 A は高くて薄い行列)。

置換 QR 分解 により、 の直交基底を構築できます。 [Q, R, P] = qr (A)span (A)

See also: chol, hess, lu, qz, schur, svd, qrupdate, qrinsert, qrdelete, qrshift.

: [Q1, R1] = qrupdate (Q, R, u, v)

Update a QR factorization given update vectors or matrices.

更新ベクトルまたは行列を指定して QR 分解を更新します。

実数または複素行列 A = Q * Rの QR 分解(Q はユニタリ、 Rは上台形)が与えられた場合、 A + u * v ' の QR 分解を返します 。ここで、uとvは列ベクトル(ランク 1 更新)または列数が等しい行列(ランク k 更新)です。後者の場合は、ランク 1 更新のシーケンスとして実行されることに注意してください。したがって、k が十分に大きい場合は、最初から分解を再計算する方が高速で正確になります。

提供される QR 因数分解は、完全因数分解 (Q が平方) またはエコノマイズ因数分解 (R が平方) のいずれかになります。

See also: qr, qrinsert, qrdelete, qrshift.

: [Q1, R1] = qrinsert (Q, R, j, x, orient)

元の因数分解された行列に挿入する行または列を指定して、QR 因数分解を更新します。

実数または複素行列 A = Q * Rの QR 分解(Q はユニタリ、 R は上台形)が与えられた場合、 [A(:,1:j-1) x A(:,j:n)] の QR 分解を返します。ここで、u はAに挿入される列ベクトル(orientの場合"col")です。または、 [A(1:j-1,:);x;A(:,j:n)] の QR 分解を返します。ここで、xはAに挿入される行ベクトル(orientの場合"row")です。

orientのデフォルト値は です"col"。orientが の 場合"col"、uは行列でj はインデックス ベクトルとなり、行列Bの QR 分解が行われます。この場合、 B(:, j )はu を、 B(:, j ) = []はA を 生成します 。後者のケースは k 回の挿入のシーケンスとして実行されることに注意してください。したがって、k が十分に大きい場合、分解を最初から再計算する方が高速で正確になります。

orientが の場合"col"、提供される QR 分解は完全 (Q が正方) またはエコノマイズ (R が正方) のいずれかになります。

orientが の場合"row"、完全な因数分解が必要です。

See also: qr, qrupdate, qrdelete, qrshift.

: [Q1, R1] = qrdelete (Q, R, j, orient)

元の因数分解行列から削除する行または列を指定して、QR 因数分解を更新します。

実数または複素行列 A = Q * Rの QR 分解(Q はユニタリ、 R は上台形)が与えられた場合、 [A(:,1:j-1), U, A(:,j:n)] の QR 分解を返します。ここで、uはAに挿入される列ベクトル (orientが の場合"col")、または [A(1:j-1,:);X;A(:,j:n)] の QR 分解(xは行ベクトル、 orientは)を返します。 orient"row"のデフォルト値は です。 "col"

orientが の場合"col"、j は、 A(:, j ) = []がB を与えるような行列Bの QR 分解の結果として得られるインデックス ベクトルである可能性があります。 後者のケースは、k 個の削除のシーケンスとして実行されることに注意してください。したがって、k が十分に大きい場合、分解を最初から再計算する方が高速で正確になります。

orientが の場合"col"、提供される QR 分解は完全 (Q が正方) またはエコノマイズ (R が正方) のいずれかになります。

orientが の場合"row"、完全な因数分解が必要です。

See also: qr, qrupdate, qrinsert, qrshift.

: [Q1, R1] = qrshift (Q, R, i, j)

元の因数分解行列でシフトする列の範囲を指定して、QR 因数分解を更新します。

実数または複素行列 A = Q * Rの QR 分解(Q はユニタリ、 Rは上台形)が与えられた場合、 A (:,p) の QR 分解を返します。ここで、 i < jの場合 、またはj< iの場合、 pは順列です。

p = [1:i-1, shift(i:j, 1), j+1:n] if i < j
or
p = [1:j-1, shift(j:i,-1), i+1:n] if j < i.

See also: qr, qrupdate, qrinsert, qrdelete.

: [AA, BB, Q, Z, V, W] = qz (A, B)

: [AA, BB, Q, Z, V, W] = qz (A, B, opt)

一般化固有値問題の QZ 分解を計算します。

一般化固有値問題は次のように定義される。

A x = lambda B x

この関数には 2 つの呼び出し形式があります。

1. [AA, BB, Q, Z, V, W] = qz (A, B)

複素 QZ 分解、一般化固有ベクトル、および一般化固有値を計算します。

AA = Q * A * Z, BB = Q * B * Z

A * V * diag (diag (BB)) = B * V * diag (diag (AA))

diag (diag (BB)) * W' * A = diag (diag (AA)) * W' * B

AAとBB は上三角行列、QとZ は ユニタリ行列です。行列VとW にはそれぞれ右と左の一般化固有ベクトルが含まれます。

2. [AA, BB, Q, Z, V, W] = qz (A, B, opt)

opt引数は"real"または の いずれかに等しくなければなりません"complex"。 に等しい場合"complex"、この呼び出し形式は 2 つの入力引数のみを持つ最初の呼び出し形式と同等になります。

optが に等しい場合"real"、実 QZ 分解が計算されます。特に、AAは対角線上に 1 行 1 列および 2 行 2 列のブロックを持つ準上三角であることのみが保証され、QとZは直交します。右および左の一般化固有ベクトルに対する上記の恒等式は、 AAが上三角である場合にのみ検証されます (つまり、すべての一般化固有値が実数である場合、実数 QZ と複素数 QZ は一致します)。

Note:qzは順列バランスを実行しますが、スケーリングは実行しません (を参照balance)。スケーリングを実行すると、 よりも精度の低い結果になる可能性がありますeig。出力引数の順序は、MATLABとの互換性のために選択されました。

固有値については、ordeig結果のAA 行列とBB行列に基づいて関数を使用して計算します。

See also: eig, gsvd, balance, chol, hess, lu, qr, qzhess, schur, ordeig.

: [aa, bb, q, z] = qzhess (A, B)

行列ペンシルのヘッセンベルク三角分解を計算し 、 qとz が直交する 、 (A, B)aa = q * A * zbb = q * B * zを返し ます 。

例えば:

[aa, bb, q, z] = qzhess ([1, 2; 3, 4], [5, 6; 7, 8])
 ⇒ aa =
     -3.02244  -4.41741
      0.92998   0.69749
 ⇒ bb =
     -8.60233  -9.99730
      0.00000  -0.23250
 ⇒ q =
     -0.58124  -0.81373
     -0.81373   0.58124
 ⇒ z =
    Diagonal Matrix
      1   0
      0   1

ヘッセンベルク三角分解は、Moler と Stewart の QZ 分解アルゴリズムの最初のステップです。

アルゴリズムは、Golub と Van Loan の 「Matrix Computations」第 2 版から引用しました。

See also: lu, chol, hess, qr, qz, schur, svd.

: S = schur (A)

: S = schur (A, "real")

: S = schur (A, "complex")

: S = schur (A, opt)

: [U, S] = schur (…)

Aのシューア分解を計算します。

正方行列Aのシューア分解は次のように定義される。

S = U' * A * U

ここで、Uはユニタリ行列(は単位行列)であり、Sは上三角行列です。 A(およびS )の固有値は、Sの対角要素です。行列Aが実数の場合、実シューア分解が計算されます。この分解では、行列U は直交行列であり、Sは対角線に沿って最大サイズのブロックを持つブロック上三角行列です 。 U'* U2 x 2

実数行列のデフォルトは実数シューア分解です。フラグを渡すことで複素分解を強制することができます"complex"。

固有値は、 optの値に応じて対角線に沿って順序付けられます。

opt = "a"

負の実部を持つ固有値をSの先頭ブロックに移動します。記憶法:"a"代数リカッチ方程式では、この順序付けが役立ちます。

opt = "d"

大きさが 1 未満の固有値をSの先頭ブロックに移動します。記憶法:"d"離散代数リカッチ方程式の場合、この順序付けが役立ちます。

opt = "u"

序なし。固有値の順序は特に指定されていません (デフォルト)。

Uの先頭のk列は常に、Sの先頭のk個の固有値に対応するA不変部分空間を張ります。

See also: rsf2csf, ordschur, ordeig, lu, chol, hess, qr, qz, svd, eig.

: [U, T] = rsf2csf (UR, TR)

実数の上準三角シューア形式TR を複素数の上三角シューア形式Tに変換します。

次の関係が成り立つことに注意してください。

UR * TR * UR' = U * T * U'は 単位行列Iです。 U' * U

UとTは一意ではないことにも注意してください。

See also: schur.

: [UR, SR] = ordschur (U, S, select)

関数で得られた 実シューア分解(U、Sschur )を並べ替えて、選択された固有値が準三角シューア行列の左上対角ブロックに表示されるようにします。

論理ベクトルselect は、Sの対角線 に沿って現れる選択された固有値を指定します。

例えば、行列A = [1, 2; 3, 4]とそのシューア分解

[U, S] = schur (A)
返すものは
U =
 -0.82456  -0.56577
  0.56577  -0.82456
S =
 -0.37228  -1.00000
  0.00000   5.37228

次のようにして、正の固有値が左上隅にくるように分解を並べ替えることができます。

[U, S] = ordschur (U, S, [0,1])

See also: schur, ordeig, ordqz.

: [AR, BR, QR, ZR] = ordqz (AA, BB, Q, Z, keyword)

: [AR, BR, QR, ZR] = ordqz (AA, BB, Q, Z, select)

一般化固有値問題の QZ 分解を並べ替えます。

一般化固有値問題は次のように定義される。

A x = lambda B x

一般化されたシューア分解は、次のqzアルゴリズムを使用して計算されます。

[AA, BB, Q, Z] = qz (A, B)

ここで、 AA、BB、Q、Zはl

AA = Q * A * Z, BB = Q * B * Z

この関数は、 AAと BBの対角線上の固有値の順序が変更されるようなordqzユニタリ変換QRと ZRを計算します。結果として得られる並べ替えられた行列ARとBR は、次の式 を満たします。

AR = QR * A * ZR, BR = QR * B * ZR

この関数は、次のように ARとBRの左上ブロック内の固有値を選択するキーワード引数を使用して呼び出すこともできます。

"S", "udi"
small: 先頭ブロックにはすべて | lambda | < 1 が含まれています
"B", "udo"
big: 先頭ブロックにすべて |ラムダ| &#8805; 1 が 含まれる
"-", "lhp"
negative real part: 先頭ブロックは開いた左半平面にすべての固有値を持つ
"+", "rhp"
non-negative real part:先頭ブロックは閉じた右半平面内のすべての固有値を持つ

キーワードの代わりに論理ベクトルselect がordqz指定された場合 、関数はすべての固有値をtrue とkなる左のブロックに 並べ替えますselect(k)。

Note: The keywords are compatible with the ones from qr.

See also: eig, ordeig, qz, schur, ordschur.

: lambda = ordeig (A)

: lambda = ordeig (A, B)

準三角行列の固有値を行列Aに現れる順序で返します。

準三角行列Aは通常、シュアー分解の結果です。2 番目の入力Bとともに呼び出された場合は、ペアA、Bの一般化固有値が行列の出現順に返されます。ペア A、B は通常、QZ 分解の結果です。 A-lambda*B

See also: ordschur, ordqz, eig, schur, qz.

: angle = subspace (A, B)

行列AとBの列によって張られる 2 つの部分空間間の最大主角を決定します。

: s = svd (A)

: [U, S, V] = svd (A)

: [U, S, V] = svd (A, "econ")

: [U, S, V] = svd (A, 0)

Aの特異値分解を計算します。

特異値分解は、次の関係によって定義される。

A = U*S*V'

この関数はsvd通常、特異値のベクトルのみを返します。3つの戻り値で呼び出されると、 U、S、Vを計算します。たとえば、

svd (hilb (3))
以下を返します
ans =
 1.4083189
 0.1223271
 0.0026873
と
[u, s, v] = svd (hilb (3))
以下を返します
u =
 -0.82704   0.54745   0.12766
 -0.45986  -0.52829  -0.71375
 -0.32330  -0.64901   0.68867
s =
 1.40832  0.00000  0.00000
 0.00000  0.12233  0.00000
 0.00000  0.00000  0.00269
v =
 -0.82704   0.54745   0.12766
 -0.45986  -0.52829  -0.71375
 -0.32330  -0.64901   0.68867

2 番目の引数に 0 以外の値を指定すると、Uまたは Vsvdの不要な行または列を削除した経済的なサイズの分解を返します。

2 番目の引数が正確に 0 の場合、分解の選択は行列Aに基づいて行われます。A の行数が列数より多い場合は、経済的なサイズの分解が返され、それ以外の場合は通常の分解が計算されます。

アルゴリズムに関する注意: 完全な分解 (特異値に加えて左特異行列と右特異行列) を計算する場合、LAPACKでは 2 つのルーチンから選択できます。Octave が使用するデフォルトのルーチンは ですgesvd。代替ルーチンは で、gesddこちらは 5 倍高速ですが、メモリ使用量が多くなり、入力行列によっては不正確になることがあります。3 つ目のルーチン は 、極端なスケールでより高い精度を実現するのに適しています。ドライバの選択の詳細については、 gejsvのドキュメントを参照してください。svd_driver

See also: svd_driver, svds, eig, lu, chol, hess, qr, qz.

: val = svd_driver ()

: old_val = svd_driver (new_val)

: old_val = svd_driver (new_val, "local")

svdで使用される基礎となるLAPACKドライバーを照会または設定します。

現在認識される値は"gesdd"、、"gesvd"およびです "gejsv"。デフォルトはです"gesvd"。

オプションを使用して関数内から呼び出されると"local"、関数とそれが呼び出すサブルーチンに対して変数がローカルに変更されます。関数を終了すると、元の変数値が復元されます。

アルゴリズムに関する注意: LAPACKライブラリ ルーチンgesvdと は、gesdd 完全な特異値分解 (左特異行列と右特異行列、および特異値) を計算する場合にのみ異なります。特異値のみを計算する場合、以下の説明は関係ありません。

新しいgesddルーチンは分割統治アルゴリズムに基づいておりgesvd、QR 分解に基づく代替法よりも 5 倍高速です。ただし、新しいアルゴリズムではメモリ使用量が大幅に増加します。MxN 入力行列の場合、メモリ使用量は O(min(M,N) ^ 2) のオーダーですが、代替法では O(max(M,N)) のオーダーになります。

このルーチンはgejsv、前処理された Jacobi SVD アルゴリズムを使用します。 や gesvdとは異なりgesdd、 にはgejsv、極端なケースで精度を低下させる可能性のあるgejsv 二重対角化ステップはありません。 また、 はある意味で最適に正確であることが知られています。 ただし、速度は遅く (コアがシングル スレッド)、メモリ使用量も多くなります (O(min(M,N) ^ 2 + M + N))。

速度とメモリの問題以外にも、入力行列の一部が によって正確に分解されない例がありましたgesdd。現在アクティブなバグhttps://savannah.gnu.org/bugs/?55564を参照してください。これらの精度の問題がLAPACKライブラリの新しいバージョンで解決されるまで、Octave のデフォルト ドライバは に設定されています"gesvd"。

See also: svd.

: [housv, beta, zer] = housh (x, j, z)

ハウスホルダー反射ベクトルhousvを計算してxを単位行列のj番目の列に 反映させる。つまり、

(I - beta*housv*housv')x =  norm (x)*e(j) if x(j) < 0,
(I - beta*housv*housv')x = -norm (x)*e(j) if x(j) >= 0
入力
x

ベクトル

j

ベクトルのインデックス

z

ゼロのしきい値(通常は 0 の数値になります)
出力 (see Golub and Van Loan):
 beta
 If beta = 0,の場合、反射は適用されません (zer は 0 に設定されます)
 housv
 ハウスホルダーvector

: [u, h, nu] = krylov (A, V, k, eps1, pflg)

ブロッククリロフ部分空間の 直交基底uを構築します。

ブロッククリロフ部分空間は次の形式を持ちます。
 [v a*v a^2*v ... a^(k+1)*v]
直交性の損失を防ぐために、ハウスホルダー反射を使用して構築されます。

Vがベクトルの場合、 hには となるヘッセンベルク行列が含まれa*u == u*h+rk*ek'、 rk = a*u(:,k)-u*h(:,k)、およびは長さkのek'ベクトルです 。それ以外の場合、h は無意味です。 [0, 0, …, 1]

Vがベクトルで、kが より大きい場合length (A) - 1、hにはとなるヘッセンベルク行列が含まれますa*u == u*h。

nuの値は、クリロフ部分空間のスパンの次元です(eps1に基づく)。

bがベクトルでkがm-1より大きい場合、hにはA のヘッセンベルク分解が含まれます。

オプションパラメータeps1はゼロのしきい値です。デフォルト値は 1e-12 です。

オプション パラメータpflgが 0 以外の場合、数値動作を改善するために行ピボットが使用されます。デフォルト値は 0 です。

参考文献: A. Hodel、P. Misra、「大規模スパース システムのクリロフ部分空間の計算における部分ピボット」、第 42 回 IEEE 意思決定および制御会議の議事録、2003 年 12 月。