关于Matlab:如何精确计算矩阵逆?

How to compute inverse of a matrix accurately?

我正在尝试计算矩阵P的逆,但是如果我乘以inv(P)*P,MATLAB不会返回单位矩阵。 它几乎是身份(10^(-12)顺序的非对角线值)。 但是,在我的应用程序中,我需要更高的精度。

在这种情况下我该怎么办?


仅当您明确需要矩阵的逆时,才使用inv(),否则,您仅使用反斜杠运算符\\

inv()上的文档明确指出:

x = A\\b is computed differently than x = inv(A)*b and is recommended for solving systems of linear equations.

这是因为反斜杠运算符或mldivide()使用最适合您特定矩阵的任何方法:

x = A\\B solves the system of linear equations A*x = B. The matrices A and B must have the same number of rows. MATLAB? displays a warning message if A is badly scaled or nearly singular, but performs the calculation regardless.

如此您就知道MATLAB根据您的输入矩阵选择哪种算法,这是其文档中提供的完整算法流程图

The versatility of mldivide in solving linear systems stems from its ability to take advantage of symmetries in the problem by dispatching to an appropriate solver. This approach aims to minimize computation time. The first distinction the function makes is between full (also called"dense") and sparse input arrays.

enter image description here


作为有关数量级误差10^(-12)的旁注,除了上述inv()函数的不准确性外,还有浮点精度。这篇有关MATLAB问题的文章颇有见地,这里有更一般的计算机科学文章。基本上,如果您正在计算数字,则不必担心(至少太多)误差小12个数量级。


您拥有所谓的病态矩阵。尝试对这种矩阵求逆是冒险的。通常,取除最小矩阵(例如线性代数课本简介中看到的矩阵)之外的任何东西的逆都是有风险的。如果必须的话,可以尝试使用Moore-Penrose伪逆(请参阅Wikipedia),但是即使那样也不是万无一失的。