基于Cholesky分解的正定矩阵求逆矩阵
来源:互联网 发布:网络机顶盒音频输出 编辑:程序博客网 时间:2024/04/30 06:34
转载地址 http://379910987.blog.163.com/blog/static/3352379720136102212297/
在前面的博客中我提到了如何实现正定矩阵的Cholesky分解,并提供了源代码,通过该代码可以将一个正定矩阵分解为一个上三角矩阵和其转置的乘积,在此基础上,对上三角矩阵进行求逆是十分简单的运算,在得到其逆矩阵之后,也就能求出原正定矩阵的逆矩阵了。
数学原理如下:
对于u的逆矩阵,可以使用下列函数进行计算:
[m,n]=size(u);
if m~=n
error('Error using in invutri.Matrix must be square.');
end
for i=1:n
for j=1:i-1
if u(i,j)~=0
error('Error using in invutri.Matrix must be up-triangle.');
end
end
end
for i=1:n
if u(i,i)==0
error('Error using in invutri.Matrix is singular.')
end
end
mu=[u,eye(n)];
for i=n:-1:1
mu(i,:)=mu(i,:)/mu(i,i);
for j=i-1:-1:1
mu(j,:)=mu(j,:)-mu(i,:)*mu(j,i);
end
end
ut=mu(:,n+1:2*n);
end
这样,结合前面的工作,我们就得到了两个m函数文件:cholesky.m和invutri.m文件,分别完成正定矩阵的Cholesky分解和上三角矩阵的求逆。接下来,我们实现正定矩阵的求逆过程,只需要三行代码即可完成工作:
u=cholesky(A);
tu=invutri(u);
B=tu*tu';
则B就是正定矩阵A的逆矩阵。
测试代码如下:
>> clear
>> A=[1 2 3 4;2 5 9 10;3 9 22 20;4 10 20 37]
A =
1 2 3 4
2 5 9 10
3 9 22 20
4 10 20 37
>> u=cholesky(A)
u =
1 2 3 4
0 1 3 2
0 0 2 1
0 0 0 4
>> tu=invutri(u)
tu =
1.0000 -2.0000 1.5000 -0.3750
0 1.0000 -1.5000 -0.1250
0 0 0.5000 -0.1250
0 0 0 0.2500
>> B=tu*tu'
B =
7.3906 -4.2031 0.7969 -0.0938
-4.2031 3.2656 -0.7344 -0.0313
0.7969 -0.7344 0.2656 -0.0313
-0.0938 -0.0313 -0.0313 0.0625
>> B*A
ans =
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
>> A*B
ans =
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
表明B确实是A的逆矩阵
这几段代码都是使用的MATLAB中的基本语句,而没有使用inv、chol等MATLAB中现成的函数,从数学原理上分析操作过程。但是也要小心的是,在使用时,cholesky函数并没有检验矩阵是否是正定的,所以计算结果有问题的时候,最好看看矩阵是否是正定的。
- 基于Cholesky分解的正定矩阵求逆矩阵
- 正定矩阵的Cholesky分解
- 正定矩阵的Cholesky分解
- 使用 uBLAS 进行实对称正定矩阵的 Cholesky 分解
- 对阵正定矩阵的楚列斯基(Cholesky)分解(C语言)
- 矩阵分解 Cholesky分解
- 矩阵分解 Cholesky分解(Cholesky decomposition)
- 基于LU分解的矩阵求逆
- Matlab与线性代数--矩阵的Cholesky分解
- 正定矩阵的稀疏张量分解
- 正定矩阵的意义
- 矩阵分解——三角分解(Cholesky 分解)
- 矩阵的正定与半正定
- 正定矩阵
- 正定矩阵
- 正定矩阵
- Matlab实现——求矩阵的逆(LU分解)
- 利用奇异值分解求矩阵的逆
- [leetcode]Jump Game &&Jump Game II
- DXUT框架中CModelCamera
- 关于use case的笔记
- linux 命令模式下的中文显示问题
- JSP的Forward及sendRedirect方法区别
- 基于Cholesky分解的正定矩阵求逆矩阵
- Lua 那些坑爹的特性
- TextView控件的一些效果
- java 队列、优先级队列、双向队列示例演示代码
- cocos2d-x新手学习之Helloworld(第三篇)[版本:cocos2d-x-3.1.1]
- test
- jxls使用模板生成excel文件
- 开发Backbone.js应用[0]--写在前面
- 集合框架相当重要,大型项目中常用(hash算法用得地方也超多)