【问题标题】:Good matrix inversion routines in CC中好的矩阵求逆例程
【发布时间】:2012-06-25 05:48:44
【问题描述】:

作为用于数值计算的 Python 代码的一部分,我必须多次反转较大(稀疏)矩阵 (~100x100)。我真的很想加快程序的速度,建议我的方法之一是调用 C 中的子例程进行矩阵求逆步骤。

对于这项任务,是否有任何推荐的高效且经过良好测试的 C 例程?

谢谢。

【问题讨论】:

  • 你看过 NumPy + SciPy 模块吗?
  • 是的,NumPy 实际上是我现在正在使用的,每个数据点大约需要 5 秒才能完成,考虑到我需要很多点,这太慢了。我已经读到 NumPy 已经被认为是相当高效的,但是从像 C 这样的编译语言中调用某些东西会为我节省很多时间吗?感谢您的评论!
  • NumPy 和 SciPy 都有很多用 C 和/或 FORTRAN 编写的对时间要求严格的循环 - 我自己没有太多使用 C 语言制作 Python 接口的经验,我不确定你能改进多少自己写一个 - 矩阵求逆往往是一项昂贵的计算。话虽如此,一种流行的矩阵求逆算法似乎是高斯消元法。
  • 哦,我现在明白了。我想我现在必须适应这种速度,并且更聪明地只对更重要的域进行采样。尽管如此,很高兴知道 NumPy 例程已经是更优化的选择之一 - Python 非常容易学习和使用!再次感谢!
  • 您可以查看CSPARSE...

标签: c matrix-inverse


【解决方案1】:
>>> from numpy import *
>>> from numpy.linalg import inv
>>> from scipy.sparse import csr_matrix
>>> m = matrix([[3,1,5],[1,0,8],[2,1,4]])
>>> s = csr_matrix(m)
>>> invs = inv(a) # Inverse sparse matrix
>>> dot(a,inva) # Check the result, should be eye(3) within machine precision
csr_matrix([[ 1.00000000e-00, 2.77555756e-17, 3.60822483e-16],
           [ 0.00000000e+00, 1.00000000e+00, 0.00000000e+00],
           [ -1.11022302e-16, 0.00000000e+00, 1.00000000e+00]])

它真的是你需要的逆吗?你也许可以在不倒置的情况下实现你的目标:

真正需要相反的情况很少见。此外, 稀疏矩阵的逆不一定是稀疏的。通常, 反相比 LU 分解更昂贵并且容易 舍入误差。

-- http://mail.scipy.org/pipermail/scipy-user/2007-October/013936.html

--> http://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.linalg.factorized.html#scipy.sparse.linalg.factorized

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    • 2011-08-30
    • 1970-01-01
    相关资源
    最近更新 更多