之前一直觉得使用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=A\b。这个算法使用高斯消去法,因此不产生逆矩阵。
“\”:反斜线符号,矩阵左除。如果A是方阵,A\B近似等于inv(A)*B,只是他们的算法不一样。如果A是n*n的方阵,B是n*1的列向量,或n*?的矩阵,那么X=A\B是AX=B的解。如果A很病态或者很奇异,很会显示警告信息。A\EYE(SIZE(A))计算A的逆,参见mldivide可得到更多信息。如果A是m*n的矩阵,m!=n,B是m*1或m*?的列向量,那么X=A\B就是线性方程组AX=B(超定或者欠定)的最小二乘解。A的有效秩(effective rank)k有选主元的QR分解决定。Asolution X is computed that has at most k nonzero componentspercolumn。如果K<N,结果通常和pinv(A)*B不一样,后者是最小范数解。A\EYE(SIZE(A))用来求解A的广义逆。
mldivide(A,B):等价于A\B,A和B必须有一样多的行,除非A是个标量(这时就等于.\)。如果A是个方阵,A\B近似等于inv(A)*B,只是两者算法不一样。如果A是m*n的矩阵,那么X=A\B求解AX=B(超定或欠定)的最小二乘解,即(AX-B)的范数极小。
此外,博文还叙述了matlab对矩阵的一些其他优化措施。
疑问:
为什么采用高斯消去能达到比inv更好的效果?