Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

lu

説明

[L,U] = lu(A)は非スパース行列またはスパース行列Aを、上三角行列Uと、置換された下三角行列Lに因数分解します。このときA = L*Uが成立します。

[L,U,P] = lu(A)はさらに、A = P'*L*Uを満たす、置換行列Pを返します。この構文では、Lは単位下三角行列で、Uは上三角行列です。

[L,U,P] = lu(A,outputForm)は、outputFormで指定した形式でPを返します。outputForm“向量”として指定すると、PA(P,:) = L*Uを満たす置換ベクトルとして返されます。

[L,U,P,Q] = lu(S)は、スパース行列Sを、単位下三角行列L、上三角行列U、行置換行列P、列置換行列Qに因数分解します。このとき、P*S*Q = L*Uが成立します。

[L,U,P,Q,D] = lu(S)はさらに、P*(D\S)*Q = L*Uを満たす対角スケーリング行列Dも返します。一般的に、行のスケーリングは、よりスパースで安定した因数分解が得られます。

[___] = lu(S,thresh)は、前述の出力引数の任意の組み合わせを使用して、luにより適用されるピボットの手法のしきい値を指定します。指定した出力引数の数によって、thresh入力の既定値と要件は異なります。詳細については、thresh引数の説明を参照してください。

[___] = lu(___,outputForm)は、outputFormで指定した形式でPQを返します。PQを置換ベクトルとして返すには、outputForm“向量”として指定します。前述の構文にある任意の入力引数の組み合わせが使用できます。

すべて折りたたむ

行列の LU 分解を計算し、生成される因子を確認します。LU 分解は、行列 A を、上三角行列 U 、下三角行列 L 、置換行列 P に分解する手法です。このとき、 PA = LU が成立します。これらの行列は、行列が行簡約階段形になるまでガウスの消去法を実行するために必要なステップを表します。行列 L にはすべての乗算器が含まれます。また、置換行列 P では行交換が考慮されます。

3 行 3 列の行列を作成し、LU 因子を計算します。

A = [10 -7 0 -3 2 6 5 -1 5];
[L,U] = lu(A)
L =3×31.0000 0 0 -0.3000 -0.0400 1.0000 0.5000 1.0000 0
U =3×310.0000 -7.0000 0 0 2.5000 5.0000 0 0 6.2000

これらの因子を乗算して、Aを再作成します。luは 2 入力の構文を使用して、置換行列Pを直接L因子に組み込みます。このとき、返されるLは実際にはP'*Lとなり、そのためA = L*Uとなります。

L*U
ans =3×310.0000 -7.0000 0 -3.0000 2.0000 6.0000 5.0000 -1.0000 5.0000

3 つの出力を指定して、置換行列をLの乗算器から分離することができます。

[L,U,P] = lu(A)
L =3×31.0000 0 0 0.5000 1.0000 0 -0.3000 -0.0400 1.0000
U =3×310.0000 -7.0000 0 0 2.5000 5.0000 0 0 6.2000
P =3×31 0 0 0 0 1 0 1 0
P'*L*U
ans =3×310.0000 -7.0000 0 -3.0000 2.0000 6.0000 5.0000 -1.0000 5.0000

LU 分解を実行し、因子を使用して問題を単純化することにより、線形システムを解きます。その結果を、バックスラッシュ演算子やdecompositionオブジェクトを使用した他の方法と比較します。

5 行 5 列の魔方陣行列を作成し、線形システム Ax = b を解きます。ここで、bのすべての要素が 65 (魔方陣の和) と等しくなります。65 はこの行列の魔方陣の和である (すべての行および列ではその和が 65 になる) ため、xについて予期される解は 1 から成るベクトルです。

A = magic(5); b = 65*ones(5,1); x = A\b
x =5×11.0000 1.0000 1.0000 1.0000 1.0000

一般的な正方行列では、バックスラッシュ演算子は LU 分解を使用して線形システムの解を計算します。LU 分解により、Aは三角行列の積として表され、三角行列を含む線形システムは代入式により簡単に解けます。

バックスラッシュにより計算された解を再作成するには、Aの LU 分解を計算します。その後、因子を使用して次の 2 つの三角線形システムを解きます。

y = L\(P*b); x = U\y;

線形システムを解く前に行列因子を事前計算するこの方法は、多数の線形システムを解く場合のパフォーマンスを向上させることができます。これは、因数分解の発生が 1 回のみで、繰り返しが不要なためです。

[L,U,P] = lu(A)
L =5×51.0000 0 0 0 0 0.7391 1.0000 0 0 0 0.4783 0.7687 1.0000 0 0 0.1739 0.2527 0.5164 1.0000 0 0.4348 0.4839 0.7231 0.9231 1.0000
U =5×523.0000 5.0000 7.0000 14.0000 16.0000 0 20.3043 -4.1739 -2.3478 3.1739 0 0 24.8608 -2.8908 -1.0921 0 0 0 19.6512 18.9793 0 0 0 0 -22.2222
P =5×50 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0
y = L\(P*b); x = U\y
x =5×11.0000 1.0000 1.0000 1.0000 1.0000

decompositionオブジェクトも、特殊化された因数分解により線形システムを解く場合に便利です。この方法では、因子の使用方法の知識を求められることなく、行列因子の事前計算によるパフォーマンス上のメリットを数多く得られます。同じ結果を再作成するには、タイプが'lu'の decomposition オブジェクトを使用します。

dA = decomposition(A,'lu'); x = dA\b
x =5×11.0000 1.0000 1.0000 1.0000 1.0000

スパース行列の LU 分解を計算して、恒等式L*U = P*S*Qを検証します。

Buckminster-Fuller 幾何ドームの結合グラフの 60 行 60 列のスパース隣接行列を作成します。

S = bucky;

4 つの出力をもつスパース行列構文を使用してSの LU 分解を計算し、行と列の置換行列を返します。

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

Sの行と列をP*S*Qと置換した結果を、三角因子L*Uを乗算した場合と比較します。1 ノルムの違いは、丸め誤差の範囲に入り、L*U = P*S*Qを示します。

e = P*S*Q - L*U; norm(e,1)
ans = 5.7732e-15

行列の LU 分解を計算します。行置換を行列ではなくベクトルとして返すことで、メモリを節約します。

1000 行 1000 列のランダム行列を作成します。

A = rand(1000);

行列Pとして保存されている置換情報を使用して LU 分解を計算します。結果を、ベクトルpとして保存されている置換情報と比較します。行列が大きいほど、置換ベクトルを使用した場合にメモリ効率がより高くなります。

[L1,U1,P] = lu(A); [L2,U2,p] = lu(A,“向量”); whosPp
Name Size Bytes Class Attributes P 1000x1000 8000000 double p 1x1000 8000 double

また、置換ベクトルを使用すると、以降の操作の実行時間が短縮されます。たとえば、前述の LU 分解を使用して、線形システム Ax = b を解くことができます。置換ベクトルから得られる解と置換行列から得られる解は等価 (丸めを除く) ですが、通常は、置換ベクトルを使用して解を求める方が時間がやや短縮されます。

スパース行列の LU 分解の計算結果を、列置換がある場合と列置換がない場合で比較します。

行列west0479を読み込みます。これは 479 行 479 列の実数値のスパース行列です。

loadwest0479A = west0479;

3 つの出力を指定してluを呼び出し,Aの LU 分解を計算します。L 因子と U 因子の spy プロットを生成します。

[L,U,P] = lu(A); subplot(1,2,1) spy(L) title('L factor') subplot(1,2,2) spy(U) title('U factor')

Figure contains 2 axes. Axes 1 with title L factor contains an object of type line. Axes 2 with title U factor contains an object of type line.

次に、4 つの出力を指定してluを使用し、Aの LU 分解を計算します。これにより、Aの列が置換され、各因子について非ゼロの数が少なくなります。この結果生成される因子は、列置換を使用しない場合と比べて、スパースの傾向が強くなっています。

[L,U,P,Q] = lu(A); subplot(1,2,1) spy(L) title('L factor') subplot(1,2,2) spy(U) title('U factor')

Figure contains 2 axes. Axes 1 with title L factor contains an object of type line. Axes 2 with title U factor contains an object of type line.

入力引数

すべて折りたたむ

入力行列。Aは非スパースまたはスパースで、正方形または長方形のサイズにすることができます。

データ型:single|double
複素数のサポート:あり

スパース入力行列。Sは正方形または長方形のサイズにすることができます。

データ型:double
複素数のサポート:あり

スパース行列に対するピボットしきい値。スカラーまたは 2 要素ベクトルとして指定します。有効な値は、[0 1]間の値です。threshを指定する方法は、luの呼び出しで指定される出力の数によって異なります。

  • 出力の数が 3 つ以下の場合、threshはスカラーでなければならず、既定値は1.0です。

  • 出力の数が 4 つ以上の場合、threshはスカラーまたは 2 要素ベクトルにできます。既定値は[0.1 0.001]です。threshをスカラーとして指定した場合、ベクトルの最初の値のみが置き換えられます。

上位レベルでは、この入力により精度と合計実行時間がトレードオフされます。threshの値を小さくするほど、スパース LU 分解を導く傾向がありますが、解は非対称になる可能性があります。より大きな値は、より正確な解を導くことができ (常にではありませんが)、通常、作業とメモリ使用量の合計が増加します。

luは、ピボットの手法を、まず出力引数の数、次に因数分解する行列のプロパティに基づいて選択します。いずれの場合でも、しきい値を1.0に設定すると部分ピボットが行われ、0に設定すると、生成される行列のスパース性のみに基づいてピボットが選択されます。Lのすべての値は、絶対値が1/min(thresh)以下です。

  • 出力引数が 3 つ以下— アルゴリズムは以下の方程式を満たす場合に対角ピボットを選択します。

    A(j,j) >= thresh * max(abs(A(j:m,j)))
    それ以外の場合、絶対値が最大である要素を含む行を選択します。

  • 対称なピボットの手法Sが、ほぼ対称構造で対角の大半が非ゼロの正方スパース行列である場合、luは対称なピボットの手法を使用します。この手法では、アルゴリズムは以下の不等式を満たす場合に対角ピボットjを選択します。

    A(i,j) >= thresh(2) * max(abs(A(j:m,j)))
    対角要素がこのテストに失敗した場合、luは以下の不等式を満たす最もスパースな行iを選択します。
    A(i,j) >= thresh(1) * max(abs(A(j:m,j)))

  • 非対称なピボットの手法Sが対称なピボットの手法の要件を満たさない場合、luは非対称な手法を使用します。この場合、luは以下の不等式を満たす最もスパースな行iを選択します。

    A(i,j) >= thresh(1) * max(abs(A(j:m,j)))
    thresh(1)の値が1.0の場合、通常の部分ピボットを行います。Lこの要素は、1/thresh(1)の絶対値またはそれより小さい値をもちます。非対称の手法では、入力ベクトルthreshの 2 番目の要素は使用されません。

メモ

非常にまれではありますが、誤った因数分解によりP*S*QL*Uとなることがあります。このような場合は、threshを最大1.0(通常の部分ピボット) まで大きくして、再度試みてください。

置換出力の形状。'matrix'または“向量”として指定します。このフラグは、luが行置換Pと列置換Qを置換行列として返すか置換ベクトルとして返すかを制御します。

行列の場合、PQは以下の恒等式を満たします。

  • 出力が 3 つ —PP*A = L*Uを満たします。

  • 出力が 4 つ —PQP*S*Q = L*Uを満たします。

  • 出力が 5 つ —PQDP*(D\S)*Q = L*Uを満たします。

ベクトルの場合、出力PQは以下の恒等式を満たします。

  • 出力が 3 つ —PA(P,:) = L*Uを満たします。

  • 出力が 4 つ —PQS(P,Q) = L*Uを満たします。

  • 出力が 5 つ —PQDD(:,P)\S(:,Q) = L*Uを満たします。

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

出力引数

すべて折りたたむ

下三角因子。行列として返されます。Lの形式は、行置換Pが個別の出力で返されるかどうかによって異なります。

  • 3 番目の出力Pを指定した場合、Lは単位下三角行列 (つまり、主対角が 1 の下三角行列) として返されます。

  • 3 番目の出力Pを指定しない場合、Lは単位下三角行列の行置換として返されます。具体的には、これは出力が 3 つの場合に返される出力PLの積P'*Lです。

上三角因子。上三角行列として返されます。

行置換。置換行列、または置換ベクトル (“向量”オプションが指定されている場合) として返されます。この出力を使用すると、計算の数値安定性が向上します。

この出力が満たす恒等式の詳細については、outputFormを参照してください。

列置換。置換行列、または置換ベクトル (“向量”オプションが指定されている場合) として返されます。この出力を使用すると、スパース行列の因子の非スパース要素 (非ゼロの数) が減ります。

この出力が満たす恒等式の詳細については、outputFormを参照してください。

行のスケーリング。対角行列として返されます。Dは、P*(D\S)*Q = L*Uを満たすようにSをスケーリングするために使用されます。常にではありませんが、一般的に、行のスケーリングを使用すると、よりスパースで安定した因数分解が得られます。

アルゴリズム

LU 分解は、ガウスの消去法の変形を使用して計算されます。正確な解を計算できるかどうかは、元の行列の条件数の値cond(A)によって異なります。行列の条件数が大きい (ほぼ特異である) 場合、計算された因数分解は正確でないことがあります。

LU 分解は、invを使用して逆行列を求めたり、detを使用して行列式の値を求めるための重要な部分です。線形方程式の求解や、演算子\/を使用した行列の除算に対しても基本的な役割を果たします。そのため、必然的に、これらの依存関数にもluの数値制限が存在することになります。

拡張機能

R2006a より前に導入