gpt4 book ai didi

python - mpmath 矩阵求逆的替代方案或加速

转载 作者:太空宇宙 更新时间:2023-11-04 01:29:07 25 4
gpt4 key购买 nike

我正在用 python 编写一些代码,这些代码需要频繁反转大方矩阵(100-200 行/列)。

我正在达到机器精度的极限,所以我开始尝试使用 mpmath 进行任意精度矩阵求逆,但它非常慢,即使使用 gmpy 也是如此。

以精度 30(十进制)对大小为 20、30、60 的随机矩阵求逆大约需要 0.19、0.60 和 4.61 秒,而 mathematica 中的相同操作需要 0.0084、0.015 和 0.055 秒。

这是在 arch linux 机器上使用 python3mpmath 0.17(不确定 gmpy 版本)。我不确定为什么 mpmath 这么慢,但是是否有任何开源库可以达到 mathematica 为此管理的速度(即使快 1/2 也不错)?

我不需要任意精度——128 位可能就足够了。我也不明白 mpmath 怎么会这么慢。它必须使用非常不同的矩阵求逆算法。具体来说,我使用的是 M**-1

有没有办法让它使用更快的算法或加速它。

最佳答案

不幸的是,mpmath 中的 Linera 代数相当慢。有许多库可以更好地解决这个问题(例如 Sage)。也就是说,作为 Stuart 建议的后续行动,使用定点算法在 Python 中进行合理快速的高精度矩阵乘法相当容易,无需安装任何库。这是一个使用 mpmath 矩阵进行输入和输出的版本:

def fixmul(A, B, prec):
m = A.rows; p = B.rows; n = B.cols;
A = [[A[i,j].to_fixed(prec) for j in range(p)] for i in range(m)]
B = [[B[i,j].to_fixed(prec) for j in range(n)] for i in range(p)]
C = [([0] * n) for r in range(m)]
for i in range(m):
for j in range(n):
s = 0
for k in range(p):
s += A[i][k] * B[k][j]
C[i][j] = s
return mp.matrix(C) * mpf(2)**(-2*prec)

在 256 位精度下,这两个 200x200 矩阵相乘对我来说比 mpmath 快 16 倍。这样直接写一个矩阵求逆程序也不难。当然,如果矩阵项非常大或非常小,您需要先重新缩放它们。一个更可靠的解决方案是使用 gmpy 中的浮点类型编写您自己的矩阵函数,这应该基本上一样快。

关于python - mpmath 矩阵求逆的替代方案或加速,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15322686/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com