当前位置: 首页 > 面试题库 >

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

国晟睿
2023-03-14
问题内容

我不太理解为什么numpy.linalg.solve()给出更准确的答案,而numpy.linalg.inv()细分了一下,给出了(我相信是)估计值。

举一个具体的例子,我正在求解等式C^{-1} * d
,其中C表示矩阵,d是一个向量数组。为了便于讨论,的尺寸为Cshape(1000,1000)dis shape (1,1000)

numpy.linalg.solve(A, b)求解A*x=bx的方程,即x = A^{-1} * b.因此,我可以通过

(1)

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

或(2)

numpy.linalg.solve(C, d)

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

到底发生了什么,一个“比另一个更好”?


问题答案:

np.linalg.solve(A, b)没有 计算的逆 一个
。相反,它调用gesvLAPACK例程之一,该例程首先使用LU分解将
A 分解,然后使用正向和反向替换求解 x
(请参见此处)。

np.linalg.inv使用相同的方法来计算的逆 通过求解 甲 -1_在 _A·甲 -1 = I,其中
是单位*。分解步骤与上面的步骤完全相同,但是要求解 A -1n×n 矩阵)要比对 xn
长向量)进行更多的浮点运算。此外,如果您随后希望通过恒等式 A -1 ·b = x 获得 x
,则额外的矩阵乘法将引起更多的浮点运算,因此会降低性能并增加数值误差。 __

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

*源的相关位inv是在这里。不幸的是,由于它是C模板,所以要理解它有点棘手。需要注意的重要一点是,身份矩阵正作为参数传递给LAPACK求解器B



 类似资料:
  • C++:15秒(源) Python:6分13秒(来源) C++:45分钟(源) 蟒蛇:10小时后被杀死(来源) 为什么Strassen矩阵乘法比标准矩阵乘法慢得多? null null null

  • 在不同大小的方阵上进行了一些实验后,一个模式出现了。对大小为的矩阵进行转置总是比对大小为的矩阵进行转置慢。对于的小值,差异不大。 但是,如果值为512,则会出现很大的差异。(至少对我来说) 免责声明:我知道函数实际上并没有转置矩阵,因为元素的双重交换,但这没有区别。 null null

  • 我目前正在做一个音频信号处理项目,需要在Java中的一个复杂矩阵上使用SVD。我当前的线性代数库是Apache Commons。但它只提供实矩阵的SVD,JAMA、JBLAS、EJML、ojAlgo都不支持复杂的SVD。 我一直在用一些技巧从一个等效的实矩阵中找到SVD。然而,当我重建矩阵时,这种技术对于虚部有很大的不准确性。

  • 问题内容: 我正在研究大型矩阵乘法,并运行以下实验以形成基准测试: 从std normal(0平均值,1 stddev)随机生成两个4096x4096矩阵X,Y。 Z = X * Y Z的元素求和(以确保它们被访问)并输出。 这是朴素的C ++实现: 编译并运行: 这是Octave / matlab实现: 跑: 八度使用BLAS(我承担功能) 硬件是Linux x86-64上的i7 3930X,内

  • 通常,投影矩阵P的定义是将点从世界坐标投影到图像/像素坐标的3x4矩阵。投影矩阵可分为: K:具有本征参数的3x4摄像机矩阵K T:具有外参数的4x4变换矩阵 null