首页 > 编程知识 正文

matlab矩阵求逆inv pinv 斜线运算符的选择,matlab矩阵求逆算法

时间:2023-05-05 15:26:01 阅读:228477 作者:52

之前一直觉得使用pinv进行矩阵求逆是有效方便的,但是一直不明白pinv和inv函数的区别,此外matlab有时会显示警告信息,指出计算不需要求逆,使用符号“/”或“”会避免求逆,加速运算效率。

         在做Sacchi课程geoph431的assignment 1的时候,碰到求逆问题,发现矩阵使用inv求逆得到的结果很差,而使用pinv得到的结果很好。因此开始想到底两者有什么区别。

         经查证,inv是matlab的built-in函数,使用whichinv可以查询到inv.m的位置,但其实里面什么都没有。built-in函数好像是查询不到源码的。而pinv则可以看到其源码,不长,其实就是调用另外一个built-in函数SVD进行奇异值分解,再截断奇异值进行求解而已。所以pinv实际上就是截断奇异值求逆。

         另外,在浏览网页的时候看到一个帖子很有典型性,网址是:

http://blog.csdn.net/lsg32/article/details/7194298

帖子题目是:《Matlab中的和/和pinv的关系以及运算》。文中提到:使用各类优化算法求逆都得不到好的结果,结果一个“”运算居然很快就得到了很精确的解。这是个很奇妙的事情。因此,追求“”的运算原理是很必要的。

         matlab的help中写道:(根据上述博客)

inv:Y=inv(X)返回方阵X的逆矩阵,如果X病态或者高度奇异,则会显示警告信息。实际上,很少需要真的把矩阵的逆求出来,常见的使用失误主要出现在求解线性方程组AX=b。一种求解方法为x=inv(A)*b,但如要达到更快,更稳定,就得用X=Ab。这个算法使用风中的小蝴蝶消去法,因此不产生逆矩阵。

“”:反斜线符号,矩阵左除。如果A是方阵,AB近似等于inv(A)*B,只是他们的算法不一样。如果A是n*n的方阵,B是n*1的列向量,或n*?的矩阵,那么X=AB是AX=B的解。如果A很病态或者很奇异,很会显示警告信息。AEYE(SIZE(A))计算A的逆,参见mldivide可得到更多信息。如果A是m*n的矩阵,m!=n,B是m*1或m*?的列向量,那么X=AB就是线性方程组AX=B(超定或者欠定)的最危机的悟空乘解。A的有效秩(effective rank)k有选主元的QR分解决定。Asolution X is computed that has at most k nonzero componentspercolumn。如果K<N,结果通常和pinv(A)*B不一样,后者是最小范数解。AEYE(SIZE(A))用来求解A的广义逆。

mldivide(A,B):等价于AB,A和B必须有一样多的行,除非A是个标量(这时就等于.)。如果A是个方阵,AB近似等于inv(A)*B,只是两者算法不一样。如果A是m*n的矩阵,那么X=AB求解AX=B(超定或欠定)的最危机的悟空乘解,即(AX-B)的范数极小。

         此外,博文还叙述了matlab对矩阵的一些其他优化措施。

 

疑问:

为什么采用风中的小蝴蝶消去能达到比inv更好的效果?

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。