Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

decomposition

求解线性系统的矩阵分解

说明

decomposition 创建可重用的矩阵分解(LU、LDL、Cholesky、QR 等),使您能够更高效地求解线性系统(Ax = b 或 xA = b)。例如,在计算 dA = decomposition(A) 后,调用 dA\b 会返回与 A\b 相同的向量,但通常要快得多。decomposition 对象非常适合计算需要重复解的问题,因为系数矩阵的分解不需要多次执行。

您可以将 decomposition 对象 dA 与许多同样适用于原始系数矩阵 A 的运算符结合使用:

  • 复共轭转置 dA'

  • 取反号 -dA

  • 使用 c*dAdA/c 乘除标量。

  • 使用 x = dA\b 求解线性系统 Ax = b。

  • 使用 x = b/dA 求解线性系统 xA = b。

创建对象

描述

示例

dA = decomposition(A) 返回矩阵 A 的分解,可用于更高效地求解线性系统。基于输入矩阵的属性自动选择分解类型。

示例

dA = decomposition(A,type) 指定要进行的分解类型。type 可以是 'qr''cod''lu''ldl''chol''triangular''permutedTriangular''banded''hessenberg''diagonal'

示例

dA = decomposition(A,type,triangularFlag) 指定在分解中仅使用 A 的上三角部分或下三角部分。triangularFlag 可以是 'upper''lower'。对于此语法,分解类型必须是 'ldl''chol''triangular'

示例

dA = decomposition(___,Name,Value) 支持任何上述语法,且可使用一个或多个 Name,Value 对组参数指定其他选项。例如,dA = decomposition(A,'CheckCondition',false) 指定在对 dA\b 求解时,不根据 A 的条件发出警告。

输入参数

全部展开

系数矩阵。系数矩阵显示在线性系统的左侧,如 Ax = b,或者显示在右侧,如 xA = b。

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

分解类型,指定为下列各表中的选项之一。

这些选项适用于任何系数矩阵。

A 的矩阵分解

注释

'auto'(默认值)

不适用

基于系数矩阵的属性自动选择矩阵分解类型。有关如何选择分解类型的信息,请参阅 mldivide算法部分。

'qr'

AP=QR

Q 是酉矩阵,R 是上三角矩阵,P 是置换矩阵。

QR 分解给出最小二乘解。

如果 type'qr',则无法对 A'\BB/A 求解。对于这些形式的问题,请改用 'cod'

'cod'

A=QRZ*

R 是上三角矩阵,QZ 都具有正交列。

完全正交分解给出最小范数最小二乘解。

对于系数方阵,也可以使用这些选项。

A 的矩阵分解

注释

'lu'

稠密矩阵:

PA=LU

L 是下三角矩阵,U 是上三角矩阵,P 是置换矩阵。

稀疏矩阵:

P(R\A)Q=LU

PQ 是置换矩阵,R 是对角线缩放矩阵。

 

'ldl'

稠密矩阵:

P*AP=LDL*

L 是下三角矩阵(1 在对角线上),D 是对角矩阵,P 是置换矩阵。

稀疏矩阵:

P*SASP=LDL*

S 是缩放矩阵。

A 必须是对称矩阵。

'chol'

稠密矩阵:

A=LL*

L 是下三角矩阵。

稀疏矩阵:

A=PLL*P*

P 是置换矩阵。

A 必须是对称正定矩阵。

'triangular'

A=T

T 是三角矩阵。

A 必须是三角矩阵。

'permutedTriangular'

A=PTQ*

T 是三角矩阵,PQ 都是置换矩阵。

A 必须是三角矩阵的置换矩阵。

'banded'

A=P*LU

P 是置换矩阵,LU 都是带状矩阵。

对低带宽矩阵最有效。有关详细信息,请参阅 bandwidth

'hessenberg'

A=P*LU

P 是置换矩阵,L 是带状矩阵,U 是上三角矩阵。

A 中第一条次对角线下方必须为零值。

'diagonal'

A=D

D 是对角矩阵。

A 必须是对角矩阵。

指明仅使用系数矩阵的上三角或下三角部分的标志,指定为 'upper''lower'。此选项支持 'triangular''chol''ldl' 分解类型。

  • 'triangular' - 如果上三角矩阵和下三角矩阵存储在同一个矩阵中,则使用 triangularFlag 指定二者之一。

  • 'chol''ldl' - 使用 triangularFlag 以避免近似对称系数矩阵变为对称。

名称-值参数

将可选的参数对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参数名称,Value 是对应的值。名称-值参数必须出现在其他参数之后,但参数对组的顺序无关紧要。

在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: dA = decomposition(A,'qr','CheckCondition',false)A 执行 QR 分解,并在使用系数矩阵求解线性系统时关闭有关系数矩阵条件的警告。

常规参数

全部展开

开启或关闭对系数矩阵条件的检查,指定为以逗号分隔的对组,其中包含 'CheckCondition' 和逻辑值 1 (true) 或 0 (false)。如果 CheckConditiontrue,而系数矩阵未正确设置条件或者秩较低,则使用 mldivide (\)mrdivide (/) 求解线性系统将产生警告。

数据类型: logical

秩容差,指定为非负标量。指定容差有助于减少系数矩阵中随机噪声对解的干扰。

decompositionA 的秩计算为 QR 分解 [Q,R,p] = qr(A,0)R 矩阵中的对角线元素数,绝对值大于 tol。如果 A 的秩是 k,则通过将 Q 的前 k 列乘以 R 的前 k 行来形成 A 的低秩逼近。更改容差会影响 A 的低秩逼近。

注意

仅当 'Type''qr''cod',或者 'Type''auto'A 为矩形时,此选项才适用。否则,此选项将被忽略。

稀疏矩阵参数

全部展开

带密度阈值,指定为 [0 1] 范围内的标量值。'BandDensity' 的值决定求解方程组时,对于 mldivide (\)mrdivide (/) 要使用的带状矩阵求解器,稀疏带状系数矩阵的密度应为多大。如果系数矩阵的带密度大于指定的带密度,则使用带状矩阵求解器。

带密度定义为:(带中的非零值个数)/(带中的元素个数)。值 1.0 指示从不使用带状矩阵求解器。

LDL 分解的主元容差,指定为 [0 0.5] 区间内的标量值。使用较小的主元容差值可以缩短分解时间并减少条目数,但也可能会导致分解不太稳定。

此主元容差与 ldl 用于实数稀疏矩阵的值相同。

LU 分解的主元容差,指定为标量或向量。可以指定标量值以更改容差向量的第一个元素,也可以指定二元素向量以更改两个值。主元容差越小,LU 因子越稀疏,但解可能不准确。值越大解越准确,但并非总是如此,而且总工作量和内存使用量通常也会增加。

此主元容差与 lu 用于稀疏矩阵的值相同。

属性

全部展开

此 属性 为只读。

系数矩阵的大小,以二元素行向量形式返回。

数据类型: double

此 属性 为只读。

分解类型,返回为 'qr''cod''lu''ldl''chol''triangular''permutedTriangular''banded''hessenberg''diagonal'

数据类型: char

开启或关闭对系数矩阵条件的检查,指定为逻辑值 1 (true) 或 0 (false)。如果 CheckConditiontrue,而系数矩阵未正确设置条件或者秩较低,则使用 mldivide (\)mrdivide (/) 求解线性系统将产生警告。

数据类型: logical

此 属性 为只读。

系数矩阵的数据类型,返回为 'double''single'

数据类型: char

此 属性 为只读。

表明系数矩阵为复共轭转置矩阵的指示符,返回为逻辑值 1 (true) 或 0 (false)。对于根据系数矩阵构造的任何 decomposition 对象,此指示符默认为 false。但是,如果您在表达式中对 decomposition 对象使用 ctranspose 运算符,例如 dA'\b,则此值为 true。在这种情况下,dA'dA 是同一个 decomposition 对象,但 IsConjugateTransposed 的值为 true

数据类型: logical

此 属性 为只读。

表明系数矩阵为实矩阵的指示符,返回为逻辑值 1 (true) 或 0 (false)。值为 false 表示系数矩阵包含复数。

数据类型: logical

此 属性 为只读。

表明系数矩阵为稀疏矩阵的指示符,返回为逻辑值 1 (true) 或 0 (false)。

数据类型: logical

此 属性 为只读。

系数矩阵的乘法缩放因子,以标量形式返回。默认值 1 表示不缩放系数矩阵。但是,当您将 decomposition 对象乘以或除以标量时,ScaleFactor 的值将改变。例如,3*dA 是与 dA 等同的 decomposition 对象,但 ScaleFactor 的值为 3

数据类型: double
复数支持:

对象函数

可用于 decomposition 对象的主要函数和运算符与求解线性系统有关。如果分解类型为 'qr',则无法求解 A'\BB/A。对于这些形式的问题,请改用 'cod'

ctranspose复共轭转置
mldivide求解关于 x 的线性方程组 Ax = B
mrdivide求解关于 x 的线性方程组 xA = B
isIllConditioned确定矩阵是否为病态

您还可以检查 decomposition 对象的基础矩阵的条件数或秩。由于采用了不同的算法,因此对 decomposition 对象使用这些函数的结果可能与直接对系数矩阵使用这些函数的结果不同。

rank
  • 仅支持单输入形式 rank(dA)

  • 分解类型必须是 'qr''cod'

  • 秩的值取决于选择的 RankTolerance(如果指定)。

rcond
  • 运行与反斜杠 \ 所用相同的条件检查来确定是否发出警告。

  • 支持除 'qr''cod' 之外的所有分解类型。

示例

全部折叠

说明使用 decomposition 对象可如何提高多右端方程 Ax=b 的求解效率。

逆迭代是一种迭代特征值算法,可对多右端线性系统求解。该方法从相应特征向量的估计值开始,以迭代方式计算矩阵特征值。每次迭代先计算 x = A\x,然后按范数缩放 x

创建稀疏矩阵 A 以及随机起始向量 x1x2

n = 1e3;
rng default % for reproducibility
A = sprandn(n,n,0.2) + speye(n);
x1 = randn(n,1);
x2 = x1;

使用反斜杠应用逆迭代算法进行 100 次迭代,以计算 A 的特征值。

tic
for ii=1:100
    x1 = A \ x1;
    x1 = x1 / norm(x1);
end
toc
Elapsed time is 29.151782 seconds.
lambda = x1'*A*x1
lambda = -0.6707

现在使用 decomposition 对象求解同一问题。

tic
dA = decomposition(A); 
for ii=1:100
    x2 = dA \ x2;
    x2 = x2 / norm(x2);
end
toc
Elapsed time is 1.178332 seconds.
lambda = x2'*A*x2
lambda = -0.6707

由于矩阵 A 不需要在每次迭代期间进行分解,因此算法的性能大大提高。而且,虽然可以通过在 for 循环之前执行 A 的 LU 分解来改进反斜杠算法,但 decomposition 对象不需要您编写复杂的代码就能获得同样的性能增益。

选择一种分解类型,以覆盖基于输入矩阵自动选择的默认类型。

创建一个系数矩阵,然后使用默认选择的分解类型来分解该矩阵。

A = ones(3);
dA = decomposition(A)
dA = 
  decomposition with properties:

    MatrixSize: [3 3]
          Type: 'lu'

  Show all properties

求解以由 1 组成的向量为右端的线性系统。

b = ones(3,1);
x = dA\b
Warning: Matrix is singular to working precision.
x = 3×1

   NaN
   NaN
   NaN

指定分解类型使用 'qr' 方法,而不是默认的 'ldl' 方法。这将强制反斜杠 (\) 求出问题的最小二乘解,而不是返回由 NaN 值组成的向量。

dA_qr = decomposition(A,'qr')
dA_qr = 
  decomposition with properties:

    MatrixSize: [3 3]
          Type: 'qr'

  Show all properties

x = dA_qr\b
Warning: Rank deficient, rank = 1, tol =  1.153778e-15.
x = 3×1

    1.0000
         0
         0

指定 'upper',在分解中仅使用输入矩阵的上三角部分。

创建一个系数矩阵。仅使用上三角部分构造矩阵的三角分解。在上三角矩阵和下三角矩阵存储在同一个矩阵中的情况下,此选项很有用。

A = randi([0 5],10)
A = 10×10

     4     0     3     4     2     1     4     5     2     0
     5     5     0     0     2     4     1     1     4     0
     0     5     5     1     4     3     3     4     3     3
     5     2     5     0     4     0     4     1     3     4
     3     4     4     0     1     0     5     5     5     5
     0     0     4     4     2     2     5     2     1     0
     1     2     4     4     2     5     3     1     4     3
     3     5     2     1     3     2     0     1     4     2
     5     4     3     5     4     3     0     3     2     0
     5     5     1     0     4     1     1     2     3     2

dA = decomposition(A,'triangular','upper')
dA = 
  decomposition with properties:

    MatrixSize: [10 10]
          Type: 'triangular'

  Show all properties

在使用 decomposition 求解线性系统时,可以使用 'CheckCondition' 名称-值对组关闭基于系数矩阵条件的警告。

创建一个病态系数矩阵。在此矩阵中,通过计算前两列的平均值得出第三列。

A = [1 2 1.5; 3 4 3.5; 5 6 5.5]
A = 3×3

    1.0000    2.0000    1.5000
    3.0000    4.0000    3.5000
    5.0000    6.0000    5.5000

求解以由 1 组成的向量作为右端的线性系统 Ax=bmldivide 生成与该系数矩阵的条件有关的警告。

b = ones(3,1);
x = A\b
Warning: Matrix is singular to working precision.
x = 3×1

   NaN
   Inf
  -Inf

现在为该矩阵创建一个 decomposition 对象,然后求解同一线性系统。将 'CheckCondition' 指定为 false,这样 mldivide 将不检查系数矩阵的条件。虽然返回的解相同,但 mldivide 不显示警告消息。

dA = decomposition(A,'CheckCondition',false);
x = dA\b
x = 3×1

   NaN
   Inf
  -Inf

使用 isIllConditioned 函数检查 decomposition 对象是否基于病态矩阵。

tf = isIllConditioned(dA)
tf = logical
   1

参考

[1] Davis, Timothy A. “Algorithm 930: FACTORIZE: An Object-Oriented Linear System Solver for MATLAB.” ACM Transactions on Mathematical Software 39, no. 4 (July 2013): 1–18. https://doi.org/10.1145/2491491.2491498.

扩展功能

版本历史记录

在 R2017b 中推出