Sha*_*ang 23 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)
求解A*x=b
x 的等式,即x = A^{-1} * b.
因此,我可以通过求解这个等式
(1)
inverse = numpy.linalg.inv(C)
result = inverse * d
Run Code Online (Sandbox Code Playgroud)
或(2)
numpy.linalg.solve(C, d)
Run Code Online (Sandbox Code Playgroud)
方法(2)给出了更精确的结果.为什么是这样?
究竟发生了什么,使一个"比另一个更好"?
ali*_*i_m 35
np.linalg.solve(A, b)
并没有计算的逆一个.相反,它调用一个gesv
LAPACK例程,它首先使用LU分解来分解A,然后使用向前和向后替换来解决x(参见此处).
np.linalg.inv
使用相同的方法来计算的逆阿通过求解甲-1在A·甲-1 = I,其中我是单位*.因子分解步骤与上面完全相同,但是需要更多的浮点运算来求解A -1(n×n矩阵)而不是x(n- long向量).此外,如果您希望通过标识A -1 ·b = x获得x,那么额外的矩阵乘法将导致更多浮点运算,因此性能降低,数值误差更大.
不需要计算A -1的中间步骤- 直接获得x更快更准确.
*源的相关位inv
是在这里.不幸的是,理解起来有点棘手,因为它是模板化的C.需要注意的重要一点是,身份矩阵作为参数传递给LAPACK求解器B
.