1

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

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

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

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

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

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

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

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

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

在效率和准确性方面是否有更好的解决方案或者第一种方法可以吗?

4

3 回答 3

3

如果你以后绝对需要逆,那么你必须计算它。如果您\以后可以再次使用反斜杠运算符 ( ) 而不是反斜杠,我会远离反斜杠并听取 MATLAB 的建议。出于数字原因,尽可能使用斜杠运算符总是更好,因此第二种方法更好,即使它更慢。

于 2013-05-14T14:29:25.773 回答
3

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

状态的文档inv

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

于 2013-05-14T14:30:19.870 回答
3

一些附加信息:

如果你要计算

Ax = b

对于许多不同b的,但有一个常数A,您可能需要预先分解A. 那是:

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

不知道其他领域,但至少在电力系统工程中经常发生这种情况。

于 2013-05-14T14:47:01.297 回答