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
相关推荐
落魄君子5 分钟前
GA-BP分类-遗传算法(Genetic Algorithm)和反向传播算法(Backpropagation)
算法·分类·数据挖掘
菜鸡中的奋斗鸡→挣扎鸡13 分钟前
滑动窗口 + 算法复习
数据结构·算法
信号处理学渣19 分钟前
matlab画图,选择性显示legend标签
开发语言·matlab
红龙创客19 分钟前
某狐畅游24校招-C++开发岗笔试(单选题)
开发语言·c++
Lenyiin22 分钟前
第146场双周赛:统计符合条件长度为3的子数组数目、统计异或值为给定值的路径数目、判断网格图能否被切割成块、唯一中间众数子序列 Ⅰ
c++·算法·leetcode·周赛·lenyiin
jasmine s29 分钟前
Pandas
开发语言·python
郭wes代码29 分钟前
Cmd命令大全(万字详细版)
python·算法·小程序
scan72443 分钟前
LILAC采样算法
人工智能·算法·机器学习
biomooc1 小时前
R 语言 | 绘图的文字格式(绘制上标、下标、斜体、文字标注等)
开发语言·r语言
骇客野人1 小时前
【JAVA】JAVA接口公共返回体ResponseData封装
java·开发语言