我想在 Python 中计算矩阵指数。我找到了一种方法(“scipy.linalg.expm()”),但它需要很长时间(例如 5000×5000 矩阵需要 30[sec])。
matrix_exponential = scipy.linalg.expm(matrix)
有没有更快的方法来计算 Python 中的矩阵指数?
非常感谢您提前。
我想在 Python 中计算矩阵指数。我找到了一种方法(“scipy.linalg.expm()”),但它需要很长时间(例如 5000×5000 矩阵需要 30[sec])。
matrix_exponential = scipy.linalg.expm(matrix)
有没有更快的方法来计算 Python 中的矩阵指数?
非常感谢您提前。
不知道这是否为时已晚,我希望你已经找到了答案。
在尝试解决具有大矩阵大小的物理学中的随机刘维尔方程时,我遇到了同样的问题。在我看来,在 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 计算能力,但是没有现成的方法来运行矩阵求幂。与使用 cupy 在 GPU 上相比,使用 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 秒。