如何在 Python 中以最快的方式计算矩阵指数?

Posted

技术标签:

【中文标题】如何在 Python 中以最快的方式计算矩阵指数?【英文标题】:How can I calculate matrix exponential in the fastest way in Python? 【发布时间】:2019-06-13 10:08:27 【问题描述】:

我想在 Python 中计算矩阵指数。 我找到了一种方法(“scipy.linalg.expm()”),但它需要很长时间(例如 30[sec] 用于 5000×5000 矩阵)。

matrix_exponential = scipy.linalg.expm(matrix)

有没有更快的方法在 Python 中计算矩阵指数?

非常感谢您。

【问题讨论】:

不确定这是否有帮助,但我相信 CuPy 对矩阵指数有 GPU 支持 相当肯定这没有帮助...买一台 Mac,我的 24 秒就能搞定 :-) :-) :-) 一般情况下可能不会。在特殊情况下。 . .也许?矩阵是厄米特矩阵吗? 大家好。感谢你的回复。我使用 Windows。不幸的是我没有mac。矩阵不是厄米矩阵。我会试试CuPy。 (尽管我现在正在努力在 PyCharm 中使用 CuPy。)如果有人知道其他方式,我很高兴听到。谢谢。 如果您已经知道要将求幂矩阵应用到哪个其他矩阵或向量,您可以使用scipy.sparse.linalg.expm_multiply,这样会快很多。 【参考方案1】:

不确定这是否为时已晚,希望您已经找到答案。

我在尝试求解具有大矩阵大小的物理学中的随机刘维尔方程时遇到了同样的问题。在我看来,在 CPU 上运行的 scipy 实现是最快的方法。

到目前为止,我发现了两个现成的软件包。一个是 scipy linalg 库 (scipy.linalg.expm(A)),另一个是 tensorflow linalg 库 (tf.linalg.expm(A))。如果安装了适当的 cuda 库,Tensorflow 将使用 GPU 进行计算。这两个库都可以在不大幅改变代码结构的情况下合并。 tensorflow 包需要在 numpy 数组和 tensorflow 数组之间进行转换。这些操作涉及在系统 RAM 和 GPU 内存之间复制数据,这往往很昂贵。

对于大小小于 12393 的方阵,两个包的 expm() 函数运行时间相同,但是 tensorflow 代码在 numpy 和 tf 数组之间转换时花费了更长的 IO 时间,并且整体速度较慢。

CuPy 还提供 GPU 计算能力,但是没有现成的方法来运行矩阵求幂。与在 GPU 上使用 cupy 相比,使用 numpy 在 CPU 上运行矩阵求逆也更快。

上述测试是在具有 Intel® Core™ i5-9400F CPU @ 2.90GHz × 6 和 GeForce GTX 1050 Ti/PCIe/SSE2 的 Linux 机器上运行的,使用大小在 243 和 12393 之间的稀疏矩阵,基于 128-位 numpy 复数。使用 scipy.linalg.expm(A) 在 6 个内核上对 5000x5000 方阵(64 位浮点数)求幂需要 22 秒。

【讨论】:

以上是关于如何在 Python 中以最快的方式计算矩阵指数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 numpy 矩阵中以科学形式显示数字?

如何在 KDB 中以二进制格式保存列表/矩阵?

如何计算 scipy 稀疏矩阵行列式而不将其变为密集?

如何使用相机矩阵在图像中以毫米为单位查找点的位置?

计算 2*2 矩阵秩的最快方法?

如何将 Argb32 加载到特征矩阵中以获得最佳性能?