当我尝试使用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甚至更大。
在效率和准确度方面是否有更好的解决方案,或者第一种方法是否合适?
答案 0 :(得分:3)
如果你以后绝对需要逆,那么你必须计算它。如果你以后可以使用反斜杠操作符(\
)而不是反转,我会远离反向并听取MATLAB的建议。由于数值原因,最好在可能的情况下使用斜杠操作符,因此即使速度较慢,第二种方法也会更好。
答案 1 :(得分:3)
您应该听Matlab并使用第二个选项。 inv(A)*b
和A\b
使用不同的算法计算,\
确实更准确。
实际上,很少需要形成矩阵的显式逆。当求解线性方程组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)));
不了解其他领域,但这至少在电力系统工程中经常发生。