目录
decomposition函数的功能是求解线性系统的矩阵分解。
语法
cs
dA = decomposition(A)
dA = decomposition(A,type)
dA = decomposition(A,type,triangularFlag)
dA = decomposition(___,Name,Value)
说明
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)**返回矩阵 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 的条件发出警告。
示例
求解多右端线性系统
说明使用 decomposition 对象可如何提高多右端方程 Ax=b 的求解效率。
逆迭代是一种迭代特征值算法,可对多右端线性系统求解。该方法从相应特征向量的估计值开始,以迭代方式计算矩阵特征值。每次迭代先计算 x = A\x,然后按范数缩放 x。
创建稀疏矩阵 A 以及随机起始向量 x1 和 x2。
cs
n = 1e3;
rng default % for reproducibility
A = sprandn(n,n,0.2) + speye(n);
x1 = randn(n,1);
x2 = x1;
使用反斜杠应用逆迭代算法进行 100 次迭代,以计算 A 的特征值。
cs
tic
for ii=1:100
x1 = A \ x1;
x1 = x1 / norm(x1);
end
toc
Elapsed time is 12.817421 seconds.
lambda = x1'*A*x1
lambda = -0.6707
现在使用 decomposition 对象求解同一问题。
cs
tic
dA = decomposition(A);
for ii=1:100
x2 = dA \ x2;
x2 = x2 / norm(x2);
end
toc
Elapsed time is 1.134237 seconds.
lambda = x2'*A*x2
lambda = -0.6707
由于矩阵 A 不需要在每次迭代期间进行分解,因此算法的性能大大提高。而且,虽然可以通过在 for 循环之前执行 A 的 LU 分解来改进反斜杠算法,但 decomposition 对象不需要您编写复杂的代码就能获得同样的性能增益。
选择分解类型
选择一种分解类型,以覆盖基于输入矩阵自动选择的默认类型。创建一个系数矩阵,然后使用默认选择的分解类型来分解该矩阵。
cpp
A = ones(3);
dA = decomposition(A)
dA =
decomposition with properties:
MatrixSize: [3 3]
Type: 'lu'
Show all properties
求解以由 1 组成的向量为右端的线性系统。
cs
b = ones(3,1);
x = dA\b
Warning: Matrix is singular to working precision.
x = 3×1
NaN
NaN
NaN
指定分解类型使用 'qr' 方法,而不是默认的 'ldl' 方法。这将强制反斜杠 (\) 求出问题的最小二乘解,而不是返回由 NaN 值组成的向量。
cs
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',在分解中仅使用输入矩阵的上三角部分。
创建一个系数矩阵。仅使用上三角部分构造矩阵的三角分解。在上三角矩阵和下三角矩阵存储在同一个矩阵中的情况下,此选项很有用。
cs
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' 名称-值对组关闭基于系数矩阵条件的警告。
创建一个病态系数矩阵。在此矩阵中,通过计算前两列的平均值得出第三列。
cs
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=b。mldivide 生成与该系数矩阵的条件有关的警告。
cs
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 不显示警告消息。
cs
dA = decomposition(A,'CheckCondition',false);
x = dA\b
x = 3×1
NaN
Inf
-Inf
使用 isIllConditioned 函数检查 decomposition 对象是否基于病态矩阵。
cpp
tf = isIllConditioned(dA)
tf = logical
1