-->

代码分析:INV是缓慢和不准确(Code Analyzer: INV is slow and ina

2019-09-03 03:20发布

当我尝试使用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或更大。

是否有效率和精度方面没有更好的办法还是第一种方法好?

Answer 1:

你应该听Matlab和使用第二个选项。 inv(A)*bA\b计算与引擎盖下不同的算法,和\确实更准确。

在对文档inv状态:

在实践中,它是很少有必要以形成矩阵的显式逆。 求解线性方程Ax = b的的系统时,INV的一个经常出现误用。 解决这个的一种方法是,其中x = INV(A)* B。 一种更好的方式,从两者的执行时间和数值精度的角度来看,是使用矩阵除法运算X = A \ B。 此使用高斯消去法,而不形成逆产生解。 见mldivide()了解更多信息。



Answer 2:

一些额外的信息:

如果你计算

Ax = b

对于许多不同的b的,但有一个恒定的A ,你可能要预先比化A 。 那是:

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

不知道其他领域,但是这至少经常出现在电力系统的工程。



Answer 3:

如果你确实需要在以后的倒数,那么你必须计算它。 如果你可以使用反斜线运算符( \后来再次),而不是相反的,我会留在逆走,听MATLAB的建议。 对于数字的原因,它始终是更好地使用斜线操作的时候可以,所以第二种方法比较好,即使它是速度较慢。



文章来源: Code Analyzer: INV is slow and inaccurate