Main Content

ldl

エルミート不定値行列のブロック LDL 分解

    説明

    非スパース データ

    [L,D] = ldl(A) は、A = L*D*L' を満たすように、非スパース行列 A を置換された下三角行列 L とブロック対角行列 D に因数分解します。

    [L,D] = ldl(A,triangle) は、triangle"upper" の場合に A の上三角を使用して因数分解を計算します。既定では、triangle"lower" であり、A の下三角を使用して因数分解が計算されます。

    [L,D,P] = ldl(___) は、P'*A*P = L*D*L' を満たす置換行列も返します。前述の構文にある任意の入力引数の組み合わせが使用できます。

    [L,D,P] = ldl(___,outputForm) は、outputForm で指定された形式で置換情報を返します。置換情報をベクトルとして返すには、outputForm"vector" と指定します。

    スパース データ

    [L,D,P] = ldl(S) は、実スパース行列 S について、P'*S*P = L*D*L' を満たす下三角因子、ブロック対角要素、置換情報を返します。

    [L,D,P,C] = ldl(S) は、P'*C*S*C*P = L*D*L' を満たすスケーリング行列も返します。この構文は、スパース行列入力に対してのみ利用可能です。

    [L,D,P,C] = ldl(S,tol) は、S を因数分解するアルゴリズムのピボット許容誤差を指定します。

    [___] = ldl(___,triangle) は、triangle"upper" の場合に実スパース S の上三角を使用して因数分解を計算します。既定では、triangle"lower" であり、S の下三角を使用して因数分解が計算されます。前述のスパース行列向けの構文にある任意の入力引数と出力引数の組み合わせを使用できます。

    [___] = ldl(___,outputForm) は、outputForm で指定された形式で置換情報を返します。置換情報をベクトルとして返すには、outputForm"vector" と指定します。

    すべて折りたたむ

    関数 ldl で 3 つの出力引数を使用して、3 行 3 列の行列の非スパース LDL 分解を計算します。

    A = [2 -1 0; -1 2 -1; 0 -1 1];
    [L1,D1,P1] = ldl(A)
    L1 = 3×3
    
        1.0000         0         0
       -0.5000    1.0000         0
             0   -0.6667    1.0000
    
    
    D1 = 3×3
    
        2.0000         0         0
             0    1.5000         0
             0         0    0.3333
    
    
    P1 = 3×3
    
         1     0     0
         0     1     0
         0     0     1
    
    

    2 つの出力引数を指定して、置換行列 PL 因子に組み込みます。ここで、L2P1*L1 と等しくなります。

    [L2,D2] = ldl(A)
    L2 = 3×3
    
        1.0000         0         0
       -0.5000    1.0000         0
             0   -0.6667    1.0000
    
    
    D2 = 3×3
    
        2.0000         0         0
             0    1.5000         0
             0         0    0.3333
    
    
    P1*L1
    ans = 3×3
    
        1.0000         0         0
       -0.5000    1.0000         0
             0   -0.6667    1.0000
    
    

    LDL 分解を実行し、因子を使用して問題を単純化することにより、線形システムを解きます。バックススラッシュ演算子、関数 ldldecomposition オブジェクトを使用して得られる解を比較します。

    3 行 3 列の行列と 3 行 1 列のベクトルを作成し、バックスラッシュ演算子を使用して線形システム A*x = b を解きます。

    A = [2 -3 4; -3 2 -3; 4 -3 1];
    b = [1; 0; 0];
    x1 = A\b
    x1 = 3×1
    
       -0.4118
       -0.5294
        0.0588
    
    

    A の LDL 分解を計算します。因子を使用してシステムを解きます。P'*A*P = L*D*L' であるため、線形システム A*x = binv(P')*L*D*L'*inv(P)*x = b と書き換えることができます。x を求めるために、線形システムを x = P*inv(L')*inv(D)*inv(L)*P'*b または x = P*(L'\(D\(L\(P'*b)))) と書き換えることができます。

    複数の異なる b の値で線形システムを解く場合、線形システムを解く前に行列因子を事前計算することで、因数分解が 1 回だけになり、繰り返す必要がないため、パフォーマンスを向上させることができます。

    [L,D,P] = ldl(A)
    L = 3×3
    
        1.0000         0         0
             0    1.0000         0
       -0.6429   -0.4286    1.0000
    
    
    D = 3×3
    
        2.0000    4.0000         0
        4.0000    1.0000         0
             0         0   -1.2143
    
    
    P = 3×3
    
         1     0     0
         0     0     1
         0     1     0
    
    
    x2 = P*(L'\(D\(L\(P'*b))))
    x2 = 3×1
    
       -0.4118
       -0.5294
        0.0588
    
    

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

    dA = decomposition(A,"ldl");
    x3 = dA\b
    x3 = 3×1
    
       -0.4118
       -0.5294
        0.0588
    
    

    因数分解する行列が大きいほど、置換ベクトルを使用することで効率がより向上します。置換ベクトルを使用すると、以降の演算の実行時間も短縮できます。

    1000 行 1000 列の対称ランダム行列を作成し、その行列の LDL 分解を計算します。関数 ldl で 3 つの出力引数を指定して置換情報を返します。行列として格納された置換情報とベクトルとして格納された置換情報のサイズを比較します。

    A = rand(1000);
    A = A + A';
    [L,D,P] = ldl(A);
    [Lv,Dv,v] = ldl(A,"vector");
    whos P v
      Name         Size                Bytes  Class     Attributes
    
      P         1000x1000            8000000  double              
      v            1x1000               8000  double              
    

    置換行列を使用する場合、因子は恒等式 P'*A*P = L*D*L' を満たします。置換ベクトルを使用する場合、因子は代わりに恒等式 A(v,v) = Lv*Dv*Lv' を満たします。

    3 行 3 列の行列の LDL 分解を下三角を使用して計算します。

    A = [2 -1 0; -3 2 -1; 0 -3 1];
    [L,D] = ldl(A)
    L = 3×3
    
        1.0000         0         0
       -1.5000    1.0000         0
             0    1.2000    1.0000
    
    
    D = 3×3
    
        2.0000         0         0
             0   -2.5000         0
             0         0    4.6000
    
    

    triangle"upper" として指定し、同じ行列の LDL 分解を上三角を使用して計算します。

    [Lu,Du] = ldl(A,"upper")
    Lu = 3×3
    
        1.0000   -0.5000         0
             0    1.0000   -0.6667
             0         0    1.0000
    
    
    Du = 3×3
    
        2.0000         0         0
             0    1.5000         0
             0         0    0.3333
    
    

    ランダム エルミート行列の LDL 分解を計算します。関数 ldl で 4 つの出力引数を指定してスケーリング行列を返します。スケーリング行列 C1 の値はスケールが異なるのに対し、ブロック対角行列 D1 はより均衡しています。

    A = randn(7);
    A = A + A';
    d = logspace(0,-20,7);
    A = A.*d.*d';
    [L1,D1,P1,C1] = ldl(sparse(A));
    full(C1)
    ans = 7×7
    1019 ×
    
        0.0000         0         0         0         0         0         0
             0    0.0000         0         0         0         0         0
             0         0    0.0000         0         0         0         0
             0         0         0    0.0000         0         0         0
             0         0         0         0    0.0000         0         0
             0         0         0         0         0    0.0046         0
             0         0         0         0         0         0    6.7627
    
    
    full(D1)
    ans = 7×7
    
        1.0000         0         0         0         0         0         0
             0   -0.2722         0         0         0         0         0
             0         0    1.2133         0         0         0         0
             0         0         0   -3.6488         0         0         0
             0         0         0         0    0.2950         0         0
             0         0         0         0         0   -0.7251         0
             0         0         0         0         0         0   13.1577
    
    

    関数 ldl で 3 つの出力引数を使用して LDL 分解を計算します。スケーリング行列出力を指定しない場合、行列 L2D2 のスケールが変わります。

    [L2,D2,P2] = ldl(sparse(A));
    full(D2)
    ans = 7×7
    
        0.0000    0.0010         0         0         0         0         0
        0.0010    1.0753         0         0         0         0         0
             0         0    0.0000    0.0000         0         0         0
             0         0    0.0000   -0.0000         0         0         0
             0         0         0         0         0         0         0
             0         0         0         0         0         0         0
             0         0         0         0         0         0         0
    
    

    入力引数

    すべて折りたたむ

    入力行列。実正方行列または複素正方行列として指定します。ldl では A が対称 (複素数の場合は エルミート) であると仮定し、既定では A の下三角のみを使用します。A がエルミートであるかどうかは ishermitian(A) を使用して確認できます。

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

    スパース入力行列。実スパース行列として指定します。ldl では S が対称であると仮定します。

    データ型: double

    入力行列の三角因子。"lower" または "upper" として指定します。このオプションを使用して、ldl が因数分解の計算に入力行列の下三角または上三角を使用するように指定します。ldl では入力行列が対称 (複素数の場合はエルミート) であると仮定し、下三角または上三角のみを使用して計算を実行します。

    3 つの出力引数を指定し、triangle"lower" の場合、分解は P'*A*P = L*D*L' を満たし、L は下三角になります。triangle"upper" の場合、分解は P'*A*P = L'*D*L を満たし、L は上三角になります。

    置換出力の形状。"matrix" または "vector" として指定します。outputForm"matrix" で下三角を使用した場合、置換行列は P'*A*P = L*D*L' を満たします。outputForm"vector" で下三角を使用した場合、置換ベクトルは A(P,P) = L*D*L' を満たします。

    実スパース行列のピボット許容誤差。範囲 [0,0.5] のスカラーとして指定します。既定の設定では tol0.01 です。小さい値を使用するほど、因数分解の時間が短くなり、因子がスパースになる可能性がありますが、因数分解が不安定になる場合があります。

    データ型: double

    出力引数

    すべて折りたたむ

    下三角因子。正方行列として返されます。既定では、L は下単位三角行列であり、対角が 1 の下三角行列になります。triangle"upper" の場合、L は上単位三角行列になります。

    ブロック対角要素。正方行列として返されます。D は、対角に 1 行 1 列と 2 行 2 列のブロックをもちます。

    置換情報。行列またはベクトル (outputForm"vector" の場合) として返されます。

    スケーリング係数。正方行列として返されます。C は、実スパース行列 S について P'*C*S*C*P = L*D*L' を満たす正のスパース対角行列です。

    詳細

    すべて折りたたむ

    エルミート行列

    • 複素共役転置 A = A' に等しい場合、正方行列 A はエルミート行列です。

      行列要素では次のようになります。

      ai,j=a¯j,i.

    • エルミート行列の対角のエントリは常に実数です。実行列は複素共役に影響されないため、対称な実行列はエルミートでもあります。たとえば、次の行列は対称であると同時にエルミートでもあります。

      A=[100210101]

    • エルミート行列の固有値は実数です。

    参照

    [1] Ashcraft, Cleve, Roger G. Grimes, and John G. Lewis. “Accurate Symmetric Indefinite Linear Equation Solvers.” SIAM Journal on Matrix Analysis and Applications 20, no. 2 (January 1998): 513–61. https://doi.org/10.1137/S0895479896296921.

    [2] Anderson, E., Z. Bai, C. Bischof, L. S. Blackford, J. Demmel, J. Dongarra, J. Du Croz, A. Greenbaum, S. Hammarling, A. McKenny, and D. Sorensen. LAPACK Users’ Guide. Philadelphia: Society for Industrial and Applied Mathematics, 1999. https://doi.org/10.1137/1.9780898719604.

    [3] Duff, Iain S. “MA57---a Code for the Solution of Sparse Symmetric Definite and Indefinite Systems.” ACM Transactions on Mathematical Software 30, no. 2 (June 2004): 118–44. https://doi.org/10.1145/992200.992202.

    拡張機能

    バージョン履歴

    R2006a より前に導入

    参考

    | | |