LDL^H分解求逆矩阵与MATLAB仿真(Right-Looking)

2024-03-25 19:52

本文主要是介绍LDL^H分解求逆矩阵与MATLAB仿真(Right-Looking),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

通过LDL^{H}分解将对称正定厄米特矩阵分解成下三角矩阵L和对角矩阵D来求其逆矩阵

目录

前言

一、LDL^H基本算法

二、LDL^H Right-Looking算法

三、D矩阵求逆

四、L矩阵求逆

五、A矩阵求逆

六、计算量分析

七、MATLAB仿真

八、参考资料

总结


前言

        在线性代数中,LDL^H分解是将一个矩阵分解为一个下三角矩阵(L)与一个对角矩阵(D)的过程。由于D是对角矩阵,那么其逆矩阵就等于其所有对角元素的倒数组合成的对角矩阵。求逆矩阵,分解之后便只需要去求L的逆矩阵进而就能求出厄米特矩阵的逆矩阵。


提示:以下是本篇文章正文内容,希望能帮助到各位,转载请附上链接。

一、LDL^H基本算法

        对于一个厄米特矩阵A,可以将其写为

\textbf{A}=\textbf{LDL}^{H}

其中D为对角矩阵,L为下三角矩阵,且对角元全为1。

A的下三角部分(即A_{i,i}\left(j=1,\ldots,N;i\geq j\right))满足:

A_{i,j}=\sum_{k=1}^jL_{i,k}D_{k,k}L_{j,k}^*

L_{i,i}D_{i,i}可按以下步骤求解:

a)

L_{1,1}=1,D_{1,1}=A_{1,1};

b)

\begin{aligned}L_{i,1}&=L_{i,1}\left/D_{1,1}\right.\left(i=2,\ldots,N\right);\end{aligned}

c) 对于第j\left(j=2,\cdots ,N\right)列:

L_{j,j}=1,D_{j,j}=A_{j,j}-\sum_{k=1}^{j-1}L_{j,k}D_{k,k}L_{j,k}^*\text{;}

\begin{aligned}L_{i,j}&=\frac{A_{i,j}-\sum_{k=1}^{j-1}L_{i,k}D_{k,k}L_{j,k}^*}{D_{j,j}}&\left(j+1\leq i\leq N\right)\end{aligned}.

d) 如果j=N,则矩阵分解完成;否则j=j+1,返回 c)。

例如,对于4×4阶矩阵,按公式写出每一个元素表达式如下图所示。

二、LDL^H Right-Looking算法

        注意到LDL分解的步骤c含有计算A_{i,j}-\sum_{k=1}^{j-1}L_{i,k}D_{k,k}L_{j,k}^* 部分,该计算在第 j 列完成列约化操作之后即可对后续子矩阵完成部分更新:

L_{i,j^{\prime}}=L_{i,j^{\prime}}-L_{i,j}D_{j,j}L_{j^{\prime},j}^{*}\left(j^{\prime}=j+1,\ldots,i\right),

称为Right-Looking结构。

L_{i,j}D_{j,j}可按以下步骤求解:

a) 

\textbf{L}=tril(\textbf{A}) (取A的下三角部分)

b) 对于第j\begin{pmatrix}j=1,\ldots,N\end{pmatrix}列:

D_{j,j}=L_{j,j},L_{j,j}=1\text{;}

c) 对于第i\begin{pmatrix}i=j+1,\ldots,N\end{pmatrix}行:

        1)执行执行列约化:

L_{i,j}=L_{i,j}/D_{j,j}\text{;}

        2)更新子矩阵对应行:

L_{i,j^{\prime}}=L_{i,j^{\prime}}-L_{i,j}D_{j,j}L_{j^{\prime},j}^*\left(j^{\prime}=j+1,\ldots,i\right);

d)如果 j = N ,则矩阵分解完成;否则j = j+1,返回b)。

例如,对于4×4阶矩阵,按公式写出每一个元素表达式如下图所示。

三、D矩阵求逆

        由于D是一个对角矩阵,所以D矩阵的逆矩阵可表示为:

\textbf{D}^{-1}=\begin{bmatrix} \frac{1}{D_{1,1}} & & & \\ &\frac{1}{D_{2,2}} & & \\ & & \ddots & \\ & & & \frac{1}{D_{N,N}} \end{bmatrix}

四、L矩阵求逆

        由于L是一个下三角矩阵,我们可以对其求共轭转置得到一个上三角矩阵,这样便可以参考下面这篇文章求其逆矩阵:

http://t.csdnimg.cn/aHPmd

五、A矩阵求逆

        因为A=LDL^H,所以

\mathbf{A}^{-1}=(\mathbf{L}^H)^{-1}\mathbf{D}^{-1}\mathbf{L}^{-1}

六、计算量分析

        对于一个N×N阶厄密对称正定A矩阵,

n(n=1,\cdots ,N)次列约化需要的除法次数为N-n

n次子矩阵更新需要的乘法次数为:

(N-n+1)(N-n)

加法次数(减可看成加)为:

\frac{(N-n+1)(N-n)}2

        那么执行完整个LDLH分解需要的

乘法次数为:

\sum_{n=1}^N\left((N-n+1)(N-n)\right)=\frac{N^3-N}3

加法次数为:

\sum_{n=1}^N\frac{(N-n+1)(N-n)}2=\frac{N^3-N}6

除法次数为:

\sum_{n=1}^{N}(N-n)=\frac{N^2-N}2

执行完之后对对角阵D求逆需要N次除法。

参考http://t.csdnimg.cn/aHPmd,对主对角线全为1的三角矩阵L求逆需要的乘法与加法次数均为

\frac{N^3-3N^2+2N}6

        因为A=LDLH,那么计算\mathbf{A}^{-1}=(\mathbf{L}^H)^{-1}\mathbf{D}^{-1}\mathbf{L}^{-1}(注意D-1是对角阵,L-1、(LH)-1是三角阵)需要的乘法次数为:

\frac{N^3+6N^2+5N}6

加法次数为:

\frac{N^3-N}6

所以通过LDL^H分解求解逆矩阵总共需要的运算次数如下:

乘法:

\frac{N^3-N}3+\frac{N^3-3N^2+2N}6+\frac{N^3+6N^2+5N}6=\frac{4N^3+3N^2+5N}6

加法:

\frac{N^3-N}6+\frac{N^3-3N^2+2N}6+\frac{N^3-N}6=\frac{N^3-N^2}2

除法:

\frac{N^2-N}2+N=\frac{N^2+N}2

七、MATLAB仿真

以MATLAB自带求逆函数inv为对比,仿真得出以下结果:

八、参考资料

https://download.csdn.net/download/m0_66360845/89030881


总结

         以上介绍了一种基于LDL^H,进而求解逆矩阵的方法与MATLAB仿真。小伙伴们认真看完此文章必定有所收获。

这篇关于LDL^H分解求逆矩阵与MATLAB仿真(Right-Looking)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/846082

相关文章

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

hdu 6198 dfs枚举找规律+矩阵乘法

number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description We define a sequence  F : ⋅   F0=0,F1=1 ; ⋅   Fn=Fn

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

perl的学习记录——仿真regression

1 记录的背景 之前只知道有这个强大语言的存在,但一直侥幸自己应该不会用到它,所以一直没有开始学习。然而人生这么长,怎就确定自己不会用到呢? 这次要搭建一个可以自动跑完所有case并且打印每个case的pass信息到指定的文件中。从而减轻手动跑仿真,手动查看log信息的重复无效低质量的操作。下面简单记录下自己的思路并贴出自己的代码,方便自己以后使用和修正。 2 思路整理 作为一个IC d

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑燃料电池和电解槽虚拟惯量支撑的电力系统优化调度方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python

libsvm在matlab中的使用方法

原文地址:libsvm在matlab中的使用方法 作者: lwenqu_8lbsk 前段时间,gyp326曾在论坛里问libsvm如何在matlab中使用,我还奇怪,认为libsvm是C的程序,应该不能。没想到今天又有人问道,难道matlab真的能运行libsvm。我到官方网站看了下,原来,真的提供了matlab的使用接口。 接口下载在: http://www.csie.ntu.edu.

线性代数|机器学习-P35距离矩阵和普鲁克问题

文章目录 1. 距离矩阵2. 正交普鲁克问题3. 实例说明 1. 距离矩阵 假设有三个点 x 1 , x 2 , x 3 x_1,x_2,x_3 x1​,x2​,x3​,三个点距离如下: ∣ ∣ x 1 − x 2 ∣ ∣ 2 = 1 , ∣ ∣ x 2 − x 3 ∣ ∣ 2 = 1 , ∣ ∣ x 1 − x 3 ∣ ∣ 2 = 6 \begin{equation} ||x