Main Content

lu

説明

[L,U] = lu(A) は、A = L*U となる上三角行列 U と行列 L を返します。ここで、L は置換行列の逆行列と下三角行列の積です。

[L,U,P] = lu(A) は、P*A = L*U となる上三角行列 U、下三角行列 L および置換行列 P を返します。構文 lu(A,'matrix') は同一です。

[L,U,p] = lu(A,'vector') は、置換情報を A(p,:) = L*U となるベクトル p として返します。

[L,U,p,q] = lu(A,'vector') は、A(p,q) = L*U となる 2 つの行ベクトル p および q として置換情報を返します。

[L,U,P,Q,R] = lu(A) は、P*(R\A)*Q = L*U となる上三角行列 U、下三角行列 L、置換行列 PQ、およびスケーリング行列 R を返します。構文 lu(A,'matrix') は同一です。

[L,U,p,q,R] = lu(A,'vector') は、R(:,p)\A(:,q) = L*U となる 2 つの行ベクトル p および q で置換情報を返します。

lu(A) は、厳密な下三角行列 L (単位対角要素のない行列) および上三角行列 U を部分行列として含む行列を返します。したがって、lu(A) は行列 U + L - eye(size(A)) を返します。ここで、L および U[L,U,P] = lu(A) として定義されます。行列 A は正方行列でなければなりません。

すべて折りたたむ

次の行列の LU 分解を計算します。これらの数値はシンボリック オブジェクトではないため、結果は浮動小数点数となります。

M = [2 -3 -1; 1/2 1 -1; 0 1 -1];
[L, U] = lu(M)
L =
    1.0000         0         0
    0.2500    1.0000         0
         0    0.5714    1.0000

U =
    2.0000   -3.0000   -1.0000
         0    1.7500   -0.7500
         0         0   -0.5714

次に、この行列をシンボリック オブジェクトに変換し、LU 分解を計算します。

M = sym(M);
[L, U] = lu(M)
L =
[   1,   0, 0]
[ 1/4,   1, 0]
[   0, 4/7, 1]
 
U =
[ 2,  -3,   -1]
[ 0, 7/4, -3/4]
[ 0,   0, -4/7]

3 つの出力引数を提供することによって、下三角行列、上三角行列、および置換行列を返します。

syms a
[L, U, P] = lu(sym([0 0 a; a 2 3; 0 a 2]))
L =
[ 1, 0, 0]
[ 0, 1, 0]
[ 0, 0, 1]
U =
[ a, 2, 3]
[ 0, a, 2]
[ 0, 0, a]
P =
     0     1     0
     0     0     1
     1     0     0

'vector' フラグを使用して、置換情報をベクトルとして返します。

syms a
A = [0 0 a; a 2 3; 0 a 2];
[L, U, p] = lu(A, 'vector')
L =
[ 1, 0, 0]
[ 0, 1, 0]
[ 0, 0, 1]
U =
[ a, 2, 3]
[ 0, a, 2]
[ 0, 0, a]
p =
     2     3     1

isAlways を使用して、A(p,:) = L*U となることをチェックします。

isAlways(A(p,:) == L*U)
ans =
  3×3 logical array
     1     1     1
     1     1     1
     1     1     1

置換行列 P をベクトル p から復元します。

P = zeros(3, 3);
for i = 1:3
    P(i, p(i)) = 1;
end
P
P =
     0     1     0
     0     0     1
     1     0     0

置換情報を、2 つのベクトル p および q で返します。

syms a
A = [a, 2, 3*a; 2*a, 3, 4*a; 4*a, 5, 6*a];
[L, U, p, q] = lu(A, 'vector')
L =
[ 1, 0, 0]
[ 2, 1, 0]
[ 4, 3, 1]
U =
[ a,  2,  3*a]
[ 0, -1, -2*a]
[ 0,  0,    0]
p =
     1     2     3
q =
     1     2     3

isAlways を使用して、A(p, q) = L*U となることをチェックします。

isAlways(A(p, q) == L*U)
ans =
  3×3 logical array
     1     1     1
     1     1     1
     1     1     1

下三角行列、上三角行列、置換行列、およびスケーリング行列を返します。

syms a
A = [0, a; 1/a, 0; 0, 1/5; 0,-1];
[L, U, P, Q, R] = lu(A)
L =
[ 1,       0, 0, 0]
[ 0,       1, 0, 0]
[ 0, 1/(5*a), 1, 0]
[ 0,    -1/a, 0, 1]
U =
[ 1/a, 0]
[   0, a]
[   0, 0]
[   0, 0]
P =
     0     1     0     0
     1     0     0     0
     0     0     1     0
     0     0     0     1
Q =
     1     0
     0     1
R =
[ 1, 0, 0, 0]
[ 0, 1, 0, 0]
[ 0, 0, 1, 0]
[ 0, 0, 0, 1]

isAlways を使用して、P*(R\A)*Q = L*U となることをチェックします。

isAlways(P*(R\A)*Q == L*U)
ans =
  4×2 logical array
     1     1
     1     1
     1     1
     1     1

'vector' フラグを使用して、置換情報をベクトル p および q として返します。また、スケーリング行列 R も計算します。

syms a
A = [0, a; 1/a, 0; 0, 1/5; 0,-1];
[L, U, p, q, R] = lu(A,'vector')
L =
[ 1,       0, 0, 0]
[ 0,       1, 0, 0]
[ 0, 1/(5*a), 1, 0]
[ 0,    -1/a, 0, 1]
U =
[ 1/a, 0]
[   0, a]
[   0, 0]
[   0, 0]
p =
     2     1     3     4
q =
     1     2
R =
[ 1, 0, 0, 0]
[ 0, 1, 0, 0]
[ 0, 0, 1, 0]
[ 0, 0, 0, 1]

isAlways を使用して、R(:,p)\A(:,q) = L*U となることをチェックします。

isAlways(R(:,p)\A(:,q) == L*U)
ans =
  4×2 logical array
     1     1
     1     1
     1     1
     1     1

出力引数を 1 つ指定するか指定しないで三角行列を部分行列として返します。

syms a
A = [0 0 a; a 2 3; 0 a 2];
lu(A)
ans =
[ a, 2, 3]
[ 0, a, 2]
[ 0, 0, a]

結果の行列が U + L - eye(size(A)) と等しくなることを確認します。ここで、L および U[L,U,P] = lu(A) として定義されます。

[L,U,P] = lu(A);
U + L - eye(size(A))
ans =
[ a, 2, 3]
[ 0, a, 2]
[ 0, 0, a]

入力引数

すべて折りたたむ

入力。数値行列またはシンボリック行列として指定します。

詳細

すべて折りたたむ

行列の LU 分解

LU 分解は、m 行 n 列の行列 A を P* A = L *U として表します。ここで、L は m 行 m 列の下三角行列、U は m 行 n 列の上三角行列、P は置換行列です。

置換ベクトル

置換ベクトル p には、行列 A の行交換に対応する数値が含まれます。m 行 m 列の行列の場合、p は、範囲が 1 から m のインデックス i と j を持つ次の置換行列を表します。

Pij=δpi,j={1 if j=pi0 if jpi

ヒント

  • シンボリック オブジェクトではない数値引数について lu を呼び出すと、MATLAB® 関数 lu が呼び出されます。

  • MATLAB 関数 lu でサポートされている thresh オプションは、シンボリック入力には影響しません。

  • 'vector' の代わりに 'matrix' を使用した場合、lu は、既定の場合と同様に置換行列を返します。

  • LU は、A が非特異な場合にのみ非特異になります。lu では特異行列 A の LU 分解も計算することができます。その場合、L または U は特異行列となります。

  • LU 分解を計算するアルゴリズムのほとんどは、ガウス消去法のバリアントです。

バージョン履歴

R2013a で導入

参考

| | | | | |