MATLAB中decomposition函数用法

目录

语法

说明

示例

求解多右端线性系统

选择分解类型

使用矩阵的三角部分

关闭矩阵条件警告


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
相关推荐
一颗星星辰2 分钟前
C语言 | 第十章 | 函数 作用域
c语言·开发语言
lxp1997413 分钟前
php函数积累
开发语言·php
科技资讯早知道7 分钟前
java计算机毕设课设—坦克大战游戏
java·开发语言·游戏·毕业设计·课程设计·毕设
꧁༺❀氯ྀൢ躅ྀൢ❀༻꧂8 分钟前
实验4 循环结构
c语言·算法·基础题
白拾18 分钟前
使用Conda管理python环境的指南
开发语言·python·conda
新晓·故知33 分钟前
<基于递归实现线索二叉树的构造及遍历算法探讨>
数据结构·经验分享·笔记·算法·链表
从0至144 分钟前
力扣刷题 | 两数之和
c语言·开发语言
总裁余(余登武)44 分钟前
算法竞赛(Python)-万变中的不变“随机算法”
开发语言·python·算法
NormalConfidence_Man1 小时前
C++新特性汇总
开发语言·c++
一个闪现必杀技1 小时前
Python练习2
开发语言·python