为什么numpy.linalg.solve()提供比numpy.linalg.inv()更精确的矩阵反转?

时间:2015-07-06 21:49:03

标签: python arrays numpy matrix linear-algebra

我不太清楚为什么numpy.linalg.solve()会给出更精确的答案,而numpy.linalg.inv()会有所分解,给出(我相信的)估计值。

对于具体示例,我正在求解等式C^{-1} * d,其中C表示矩阵,d是向量数组。为了便于讨论,C的维度为(1000,1000)形状,d为形状(1,1000)

numpy.linalg.solve(A, b)解决了x的等式A*x=b,即x = A^{-1} * b.因此,我可以通过

解决这个等式

(1)

inverse = numpy.linalg.inv(C)
result = inverse * d

或(2)

numpy.linalg.solve(C, d)

方法(2)给出了更精确的结果。为什么是这样?

究竟发生了什么,以便一个人能够更好地工作"比另一个?

1 个答案:

答案 0 :(得分:32)

np.linalg.solve(A, b) 计算 A 的倒数。相反,它会调用其中一个gesv LAPACK routines,它首先使用LU分解来解析 A ,然后使用前向和后向替换来解析 x (请参阅here )。

np.linalg.inv使用相同的方法通过求解 A中的 A -1 来计算 A 的逆矩阵·A -1 = I 其中 I 是身份*。因子分解步骤与上述完全相同,但需要更多的浮点运算来解决 A -1 n×n 矩阵)而不是 x (一个 n - 长矢量)。另外,如果你想通过标识 A -1 ·b = x 获得 x ,那么额外的矩阵乘法会产生更多浮动点操作,因此性能降低,数值误差更大。

不需要计算 A -1 的中间步骤 - 直接获取 x 更快,更准确。

* inv的相关位源为here。不幸的是,理解它有点棘手,因为它是模板化的C.需要注意的重要一点是,身份矩阵作为参数B传递给LAPACK求解器。