0 python optimization matrix sparse-matrix matrix-inverse
我目前正在 Python 上使用最小二乘算法,涉及一些大地测量计算。
我选择了Python(它不是最快的)并且它运行得很好。然而,在我的代码中,我有大型稀疏对称(非正定,因此不能使用 Cholesky)矩阵的逆来执行(下图)。我目前使用 np.linalg.inv() ,它使用 LU 分解方法。
我很确定在速度方面需要进行一些优化。
我想到了 Cuthill-McKee 算法来重新排列矩阵并取其逆。您有什么想法或建议吗?
非常感谢您的回答!
好消息是,如果您使用任何流行的 Python 线性代数库(即 numpy),Python 的速度对于数学来说确实并不重要 \xe2\x80\x93 一切都完成了本身就在图书馆内。
\n例如,当您编写 时matrix_prod = matrix_a @ matrix_b
,不会触发一堆 Python 循环来将两个矩阵相乘,而是使用 numpy 的内部实现(我认为使用 FORTRAN LAPACK 库)。
当涉及求解指定稀疏方程组的稀疏存储矩阵时,scipy.sparse.linalg模块可以为您提供帮助。(这就是你对矩阵的逆所做的事情)。如果你想使用稀疏矩阵,那就是你的方法 \xe2\x80\x93 请注意,有些矩阵在数学上是稀疏的(即,大多数条目都是 0),并且矩阵存储为稀疏矩阵,这意味着您可以避免存储数百万个零。Numpy 本身没有稀疏存储矩阵,但 scipy 有。
\n如果您的矩阵存储密集,但数学上稀疏,即您使用标准 numpy ndarray 来存储它,那么通过在 Python 中实现任何内容都不会变得更快。与高度优化的反演相比,Python 的实际缓慢性将抵消理论上的复杂性增益。
\n对稀疏矩阵求逆通常会失去稀疏性。另外,如果你能避免矩阵的逆,你就永远不会逆矩阵!对于稀疏矩阵,求解线性方程组 Ax = b(其中 A 为矩阵和 ba 已知向量,对于 x)比计算 A\xe2\x81\xbb\xc2\xb9 要快得多!所以,
\n\n\n我目前正在 Python 上使用最小二乘算法,涉及一些大地测量计算。
\n
因为 LS 说你不需要逆矩阵,所以永远不要计算它。LS 的要点是找到一个尽可能接近的解决方案,即使您的矩阵不可逆。稀疏矩阵很可能就是这种情况!
\n