代码分析器:INV速度慢且不准确

时间:2013-05-14 14:05:52

标签: matlab linear-algebra numerical-methods matrix-inverse

当我尝试使用Matlab的inv()操作计算矩阵逆时:

A = rand(10,10);
b = rand(10,1);

C = inv(A);
D = C*b;

我在最后一行收到以下警告:INV很慢且不准确。对于INV(A)* b使用A \ b,对于b * INV(A)使用b / A.

我可以将上面的代码更改为:

A = rand(10,10);
b = rand(10,1);

C = inv(A);
D = A\b;

现在我没有得到警告,但我不认为这个解决方案更好。

注意:我需要存储矩阵A的逆矩阵和inv(A)* c。另外,在我的真实文件中,矩阵A的大小可以是5000 x 5000甚至更大。

在效率和准确度方面是否有更好的解决方案,或者第一种方法是否合适?

3 个答案:

答案 0 :(得分:3)

如果你以后绝对需要逆,那么你必须计算它。如果你以后可以使用反斜杠操作符(\)而不是反转,我会远离反向并听取MATLAB的建议。由于数值原因,最好在可能的情况下使用斜杠操作符,因此即使速度较慢,第二种方法也会更好。

答案 1 :(得分:3)

您应该听Matlab并使用第二个选项。 inv(A)*bA\b使用不同的算法计算,\确实更准确。

documentation for inv州:

  

实际上,很少需要形成矩阵的显式逆。当求解线性方程组Ax = b时,会出现频繁误用inv。解决此问题的一种方法是使用x = inv(A)* b。从执行时间和数值精度的角度来看,更好的方法是使用矩阵除法运算符x = A \ b。这使用高斯消元产生解,而不形成逆。有关详细信息,请参阅mldivide()。

答案 2 :(得分:3)

其他一些信息:

如果你要计算

Ax = b

对于许多不同的b,但使用常量A,您可能需要预先分解A。那就是:

[L U P] = lu(A);
x = (U \ (L \ ( P * b)));

不了解其他领域,但这至少在电力系统工程中经常发生。