decomposition
求解线性方程组的矩阵分解
说明
decomposition
创建可重用的矩阵分解(LU、LDL、Cholesky、QR 等),使您能够更高效地求解线性方程组(Ax = b 或 xA = b)。例如,在计算 dA = decomposition(A)
后,调用 dA\b
会返回与 A\b
相同的向量,但通常要快得多。decomposition
对象非常适合计算需要重复解的问题,因为系数矩阵的分解不需要多次执行。
您可以将 decomposition
对象 dA
与许多同样适用于原始系数矩阵 A
的运算符结合使用:
复共轭转置
dA'
取反号
-dA
使用
c*dA
或dA/c
乘除标量。使用
x = dA\b
求解线性方程组 Ax = b。使用
x = b/dA
求解线性方程组 xA = b。
创建对象
语法
说明
指定在分解中仅使用 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
的条件发出警告。
输入参数
A
- 系数矩阵
矩阵
系数矩阵。系数矩阵显示在线性方程组的左侧,如 Ax = b,或者显示在右侧,如 xA = b。
数据类型: single
| double
复数支持: 是
type
- 分解类型
'auto'
(默认) | 'qr'
| 'cod'
| 'lu'
| 'ldl'
| 'chol'
| 'triangular'
| 'permutedTriangular'
| 'banded'
| 'hessenberg'
| 'diagonal'
分解类型,指定为下列各表中的选项之一。
这些选项适用于任何系数矩阵。
值 |
| 注释 |
---|---|---|
| 不适用 | 基于系数矩阵的属性自动选择矩阵分解类型。有关如何选择分解类型的信息,请参阅 |
|
| QR 分解给出最小二乘解。 如果 |
|
| 完全正交分解给出最小范数最小二乘解。 |
对于系数方阵,也可以使用这些选项。
值 |
| 注释 |
---|---|---|
| 稠密矩阵:
稀疏矩阵:
| |
| 稠密矩阵:
稀疏矩阵:
|
|
| 稠密矩阵:
稀疏矩阵:
|
|
|
|
|
|
|
|
|
| 对低带宽矩阵最有效。有关详细信息,请参阅 |
|
|
|
|
|
|
triangularFlag
- 指明仅使用系数矩阵的上三角或下三角部分的标志
'upper'
| 'lower'
指明仅使用系数矩阵的上三角或下三角部分的标志,指定为 'upper'
或 'lower'
。此选项支持 'triangular'
、'chol'
和 'ldl'
分解类型。
'triangular'
- 如果上三角矩阵和下三角矩阵存储在同一个矩阵中,则使用triangularFlag
指定二者之一。'chol'
和'ldl'
- 使用triangularFlag
以避免近似对称系数矩阵变为对称。
指定可选的、以逗号分隔的 Name,Value
对组参数。Name
为参数名称,Value
为对应的值。Name
必须放在引号中。您可采用任意顺序指定多个名称-值对组参数,如 Name1,Value1,...,NameN,ValueN
所示。
示例: dA = decomposition(A,'qr','CheckCondition',false)
对 A
执行 QR 分解,并在使用系数矩阵求解线性方程组时关闭有关系数矩阵条件的警告。
CheckCondition
- 开启或关闭对系数矩阵条件的检查
true
(默认) | false
开启或关闭对系数矩阵条件的检查,指定为以逗号分隔的对组,其中包含 'CheckCondition'
和逻辑值 1
(true
) 或 0
(false
)。如果 CheckCondition
为 true
,而系数矩阵未正确设置条件或者秩较低,则使用 mldivide (\)
或 mrdivide (/)
求解线性方程组将产生警告。
数据类型: logical
RankTolerance
- 秩容差
非负标量
秩容差,指定为非负标量。指定容差有助于减少系数矩阵中随机噪声对解的干扰。
decomposition
将 A
的秩计算为 QR 分解 [Q,R,p] = qr(A,0)
的 R
矩阵中的对角线元素数,绝对值大于 tol
。如果 A
的秩是 k
,则通过将 Q
的前 k
列乘以 R
的前 k
行来形成 A
的低秩逼近。更改容差会影响 A
的低秩逼近。
注意
仅当 'Type'
为 'qr'
或 'cod'
,或者 'Type'
为 'auto'
而 A
为矩形时,此选项才适用。否则,此选项将被忽略。
BandDensity
- 带密度阈值
0.5
(默认) | 标量
带密度阈值,指定为 [0 1]
范围内的标量值。'BandDensity'
的值决定求解方程组时,对于 mldivide (\)
或 mrdivide (/)
要使用的带状矩阵求解器,稀疏带状系数矩阵的密度应为多大。如果系数矩阵的带密度大于指定的带密度,则使用带状矩阵求解器。
带密度定义为:(带中的非零值个数)/(带中的元素个数)。值 1.0
指示从不使用带状矩阵求解器。
LDLPivotTolerance
- LDL 分解的主元容差
0.01
(默认) | 标量
LDL 分解的主元容差,指定为 [0 0.5]
区间内的标量值。使用较小的主元容差值可以缩短分解时间并减少条目数,但也可能会导致分解不太稳定。
此主元容差与 ldl
用于实数稀疏矩阵的值相同。
LUPivotTolerance
- LU 分解的主元容差
[0.1 0.001]
(默认) | 标量 | 向量
LU 分解的主元容差,指定为标量或向量。可以指定标量值以更改容差向量的第一个元素,也可以指定二元素向量以更改两个值。主元容差越小,LU 因子越稀疏,但解可能不准确。值越大解越准确,但并非总是如此,而且总工作量和内存使用量通常也会增加。
此主元容差与 lu
用于稀疏矩阵的值相同。
属性
MatrixSize
- 系数矩阵的大小
向量
此属性为只读
系数矩阵的大小,以二元素行向量形式返回。
数据类型: double
Type
- 分解类型
'qr'
| 'cod'
| 'lu'
| 'ldl'
| 'chol'
| 'triangular'
| 'permutedTriangular'
| 'banded'
| 'hessenberg'
| 'diagonal'
此属性为只读
分解类型,返回为 'qr'
、'cod'
、'lu'
、'ldl'
、'chol'
、'triangular'
、'permutedTriangular'
、'banded'
、'hessenberg'
或 'diagonal'
。
数据类型: char
CheckCondition
- 开启或关闭对系数矩阵条件的检查
true
(默认) | false
开启或关闭对系数矩阵条件的检查,指定为逻辑值 1
(true
) 或 0
(false
)。如果 CheckCondition
为 true
,而系数矩阵未正确设置条件或者秩较低,则使用 mldivide (\)
或 mrdivide (/)
求解线性方程组将产生警告。
数据类型: logical
Datatype
- 系数矩阵的数据类型
'double'
| 'single'
此属性为只读
系数矩阵的数据类型,返回为 'double'
或 'single'
。
数据类型: char
IsConjugateTransposed
- 表明系数矩阵为复共轭转置矩阵的指示符
false
(默认) | true
此属性为只读
表明系数矩阵为复共轭转置矩阵的指示符,返回为逻辑值 1
(true
) 或 0
(false
)。对于根据系数矩阵构造的任何 decomposition
对象,此指示符默认为 false
。但是,如果您在表达式中对 decomposition
对象使用 ctranspose
运算符,例如 dA'\b
,则此值为 true
。在这种情况下,dA'
与 dA
是同一个 decomposition
对象,但 IsConjugateTransposed
的值为 true
。
数据类型: logical
IsReal
- 表明系数矩阵为实矩阵的指示符
true
| false
此属性为只读
表明系数矩阵为实矩阵的指示符,返回为逻辑值 1
(true
) 或 0
(false
)。值为 false
表示系数矩阵包含复数。
数据类型: logical
IsSparse
- 表明系数矩阵为稀疏矩阵的指示符
true
| false
此属性为只读
表明系数矩阵为稀疏矩阵的指示符,返回为逻辑值 1
(true
) 或 0
(false
)。
数据类型: logical
ScaleFactor
- 系数矩阵的乘法缩放因子
1
(默认) | 标量
此属性为只读
系数矩阵的乘法缩放因子,以标量形式返回。默认值 1
表示不缩放系数矩阵。但是,当您将 decomposition
对象乘以或除以标量时,ScaleFactor
的值将改变。例如,3*dA
是与 dA
等同的 decomposition
对象,但 ScaleFactor
的值为 3
。
数据类型: double
复数支持: 是
对象函数
可用于 decomposition
对象的主要函数和运算符与求解线性方程组有关。如果分解类型为 'qr'
,则无法求解 A'\B
或 B/A
。对于这些形式的问题,请改用 'cod'
。
ctranspose | 复共轭转置 |
mldivide | 求解关于 x 的线性方程组 Ax = B |
mrdivide | 求解关于 x 的线性方程组 xA = B |
isIllConditioned | 确定矩阵是否为病态 |
您还可以检查 decomposition
对象的基础矩阵的条件数或秩。由于采用了不同的算法,因此对 decomposition
对象使用这些函数的结果可能与直接对系数矩阵使用这些函数的结果不同。
示例
求解多右端线性方程组
说明使用 decomposition
对象可如何提高多右端方程 的求解效率。
逆迭代是一种迭代特征值算法,可对多右端线性方程组求解。该方法从相应特征向量的估计值开始,以迭代方式计算矩阵特征值。每次迭代先计算 x = A\x
,然后按范数缩放 x
。
创建稀疏矩阵 A
以及随机起始向量 x1
和 x2
。
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 18.071840 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.015482 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: 'ldl' 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 组成的向量作为右端的线性方程组 。mldivide
生成与该系数矩阵的条件有关的警告。
b = ones(3,1); x = A\b
Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND = 8.326673e-18.
x = 3×1
-0.0556
1.9444
-1.8889
现在为该矩阵创建一个 decomposition
对象,然后求解同一线性方程组。将 'CheckCondition'
指定为 false
,这样 mldivide
将不检查系数矩阵的条件。虽然返回的解相同,但 mldivide
不显示警告消息。
dA = decomposition(A,'CheckCondition',false);
x = dA\b
x = 3×1
-0.0556
1.9444
-1.8889
使用 isIllConditioned
函数检查 decomposition
对象是否基于病态矩阵。
tf = isIllConditioned(dA)
tf = logical
1
扩展功能
基于线程的环境
使用 MATLAB® backgroundPool
在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool
加快代码运行速度。
此函数完全支持基于线程的环境。有关详细信息,请参阅Run MATLAB Functions in Thread-Based Environment。
分布式数组
使用 Parallel Computing Toolbox™ 在群集的组合内存中对大型数组进行分区。
用法说明和限制:
如果
A
是稠密矩阵,则type
不支持值'ldl'
、'cod'
和'hessenberg'
。如果
A
是稀疏矩阵,则type
不支持值'chol'
、'cod'
和'hessenberg'
。如果
A
是稀疏矩阵,而type
是'lu'
,则CheckCondition
必须为 false,因为rcond
无法确定条件数倒数。如果
A
是稀疏矩阵,则对于rcond(decomposition(A,'lu','CheckCondition',false))
,MATLAB® 返回[]
。
有关详细信息,请参阅Run MATLAB Functions with Distributed Arrays (Parallel Computing Toolbox)。
版本历史记录
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)