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
相关推荐
沐怡旸3 小时前
【算法】【链表】328.奇偶链表--通俗讲解
算法·面试
掘金安东尼7 小时前
Amazon Lambda + API Gateway 实战,无服务器架构入门
算法·架构
码流之上7 小时前
【一看就会一写就废 指间算法】设计电子表格 —— 哈希表、字符串处理
javascript·算法
快手技术9 小时前
快手提出端到端生成式搜索框架 OneSearch,让搜索“一步到位”!
算法
CoovallyAIHub1 天前
中科大DSAI Lab团队多篇论文入选ICCV 2025,推动三维视觉与泛化感知技术突破
深度学习·算法·计算机视觉
NAGNIP1 天前
Serverless 架构下的大模型框架落地实践
算法·架构
moonlifesudo1 天前
半开区间和开区间的两个二分模版
算法
moonlifesudo1 天前
300:最长递增子序列
算法
CoovallyAIHub1 天前
港大&字节重磅发布DanceGRPO:突破视觉生成RLHF瓶颈,多项任务性能提升超180%!
深度学习·算法·计算机视觉
CoovallyAIHub1 天前
英伟达ViPE重磅发布!解决3D感知难题,SLAM+深度学习完美融合(附带数据集下载地址)
深度学习·算法·计算机视觉