当我尝试使用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或更大。
是否有效率和精度方面没有更好的办法还是第一种方法好?
你应该听Matlab和使用第二个选项。 inv(A)*b
和A\b
计算与引擎盖下不同的算法,和\
确实更准确。
在对文档inv
状态:
在实践中,它是很少有必要以形成矩阵的显式逆。 求解线性方程Ax = b的的系统时,INV的一个经常出现误用。 解决这个的一种方法是,其中x = INV(A)* B。 一种更好的方式,从两者的执行时间和数值精度的角度来看,是使用矩阵除法运算X = A \ B。 此使用高斯消去法,而不形成逆产生解。 见mldivide()了解更多信息。
一些额外的信息:
如果你计算
Ax = b
对于许多不同的b
的,但有一个恒定的A
,你可能要预先比化A
。 那是:
[L U P] = lu(A);
x = (U \ (L \ ( P * b)));
不知道其他领域,但是这至少经常出现在电力系统的工程。
如果你确实需要在以后的倒数,那么你必须计算它。 如果你可以使用反斜线运算符( \
后来再次),而不是相反的,我会留在逆走,听MATLAB的建议。 对于数字的原因,它始终是更好地使用斜线操作的时候可以,所以第二种方法比较好,即使它是速度较慢。