为什么Matlab中的inv计算速度慢且不准确?

16

我在文档和这篇博客文章中看到过(http://blogs.mathworks.com/loren/2007/05/16/purpose-of-inv/),Matlab中使用inv不被推荐,因为它的速度慢且不准确。

我正在尝试找出这种不准确性的原因。目前为止,谷歌没有给我提供有趣的结果,所以我想这里的某个人可以指导我。

谢谢!

3个回答

33

我提到的不准确性是针对 INV 方法而言的,而不是 MATLAB 实现的问题。解决方程组应该使用 QR、LU 或其他方法,因为这些方法通常不需要计算所涉系统条件数的平方。使用 inv 方法通常需要一种操作,通过将原始系统的条件数平方而失去精度。

--Loren


19

我认为Loren博客的观点并不是说MATLAB的inv函数比其他计算矩阵逆的数值实现特别慢或不准确;相反,在大多数情况下,逆本身并不需要,你可以通过其他方式进行操作(如使用\ - 反斜杠运算符 - 解决线性系统而不是计算逆)。


1
此外,反斜杠运算符(通常)比inv(A)b给出更准确的结果:它选择一个合适的算法来解决Ax=b。 - Martijn
2
为了给学生们明确,你要写x = A \ b而不是x = inv(A) * b来解线性方程组Ax=b。计算A的逆矩阵不是必要的,也不够健壮和快速。在大部分数学公式中,当你看到一个A^-1时,可以在根本不计算A的逆矩阵的情况下实现该算法。尽管如此,对于小的满秩矩阵,计算inv(A)通常是完全没有问题的。对于大矩阵或条件差的矩阵,计算逆矩阵可能会有问题。 - Matthew Gunn
我不明白为什么 inv 没有简单地实现为 inv(a) = a\I,其中 I 是与 a 大小相同的单位矩阵?我知道这个话题很旧了,但开一个新话题只为这个问题似乎太过了。 - Paradoxy

1

inv()\慢,除非您需要解决多个右手边向量。然而,MathWorks关于不准确性的建议是由于数值线性代数结果中过度保守的界限。换句话说,inv()并不不准确。该链接进一步阐述:http://arxiv.org/abs/1201.6035

几本广泛使用的教科书让读者相信通过将向量b乘以计算出的逆inv(A)来解决线性方程组Ax=b是不准确的。几乎所有其他的数值分析和数值线性代数教科书都建议不要使用计算的逆而没有说明这是否准确。事实上,在对逆的计算进行合理假设的情况下,x=inv(A)*b与最佳后向稳定求解器计算得到的解一样准确。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接