【发布时间】:2013-03-10 13:21:45
【问题描述】:
我正在用 python 编写一些代码,这些代码需要经常反转大型方阵(100-200 行/列)。
我正在达到机器精度的极限,因此开始尝试使用mpmath 进行任意精度矩阵求逆,但速度非常慢,即使使用gmpy。
在精度为 30(十进制)的情况下反转大小为 20、30、60 的随机矩阵需要约 0.19、0.60 和 4.61 秒,而在 mathematica 中的相同操作需要 0.0084、0.015 和 0.055 秒。
这是在arch linux机器上使用python3和mpmath 0.17(不确定gmpy版本)。我不确定为什么 mpmath 慢得多,但是是否有任何开源库可以接近数学为此管理的速度(即使快 1/2 也不错)?
我不需要任意精度——128 位可能就足够了。我也只是不明白 mpmath 怎么会这么慢。它必须使用非常不同的矩阵求逆算法。具体来说,我使用的是M**-1。
有没有办法让它使用更快的算法或加速它。
【问题讨论】:
-
你只是用矩阵求逆来解一组方程吗?如果是这样,那么有更有效的方法不需要明确要求逆。 LU 分解我相信效率更高。
-
不,我在线性规划问题的变体中使用它,所以我需要逆来明确确定成本函数。事实上,问题在于,随着成本变得非常小,不精确的逆可能会导致各种问题。但我认为达到 128 位精度就足够了(至少对于我目前的目的而言)。
-
当然我从不需要实际的逆,而是需要它乘以其他一些矩阵。所以它与求解 A.x=b 不太相似,因为我需要 A^-1 * b 和 b 是矩阵而不是向量。但也许有一种方法可以概括为矩阵找到这样的解决方案? OTOH,我需要这样做很多次,所以找到逆可能真的会更好。
-
为许多 b 评估 A^-1 * b 正是 LU 分解的优点。这同样适用于评估 A^-1 * B 其中 B 矩阵,这与评估矩阵 B 的每一列 b 的 A^-1 * b 相同...
-
我需要进一步研究这种可能性。你有好的参考吗?
标签: python python-3.x matrix inversion mpmath