Main Content

ldl

埃尔米特不定矩阵的分块 LDL 分解

    说明

    满数据

    示例

    [L,D] = ldl(A) 将满矩阵 A 分解为置换的下三角矩阵 L 和满足 A = L*D*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 矩阵的完整 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
    
    

    通过指定两个输出参量,将置换矩阵 P 合并到 L 因子中。此处,L2 等于 P1*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 分解并使用因子来简化问题,对线性系统求解。比较通过使用反斜杠运算符、ldl 函数和 decomposition 对象获得的解。

    创建一个 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 = b 可以重写为 inv(P')*L*D*L'*inv(P)*x = b。通过求解 x,线性系统可重写为 x = P*inv(L')*inv(D)*inv(L)*P'*bx = P*(L'\(D\(L\(P'*b))))

    在求解线性系统之前预先计算矩阵因子可以在求解具有几个不同 b 值的线性系统时提高性能,因为分解只发生一次,不需要重复。

    [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 函数指定三个输出参量以返回置换信息。比较存储为矩阵和存储为向量的置换信息的大小。

    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 函数指定四个输出参量以返回缩放矩阵。缩放矩阵 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 计算 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 的下三角形。您可以通过使用 ishermitian(A) 来检查 A 是否为埃尔米特矩阵。

    数据类型: single | double
    复数支持:

    稀疏输入矩阵,指定为实稀疏矩阵。ldl 假设 S 是对称矩阵。

    数据类型: double

    输入矩阵的三角因子,指定为 "lower""upper"。使用此选项指定 ldl 应使用输入矩阵的下三角形或上三角形来计算分解。ldl 假设输入矩阵是对称矩阵(如果是复矩阵,则为埃尔米特矩阵),并且仅使用下三角形或上三角形来执行计算。

    如果指定三个输出参量,并且 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",则以向量形式返回。

    缩放因子,以方阵形式返回。对于实稀疏矩阵 SC 是满足 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 之前推出

    另请参阅

    | | |