我想在Python中计算矩阵指数。 我找到了一种方法(“ scipy.linalg.expm()”),但是它花费的时间很长(例如,对于5000×5000矩阵为30秒)。
matrix_exponential = scipy.linalg.expm(matrix)
在Python中,有没有更快的方法来计算矩阵指数?
非常感谢您。
答案 0 :(得分:1)
不确定是否为时已晚,希望您找到了答案。
在尝试解决具有大矩阵尺寸的物理学中的随机Liouville方程时,我面临着同样的问题。在我看来,在CPU上运行scipy实现是最快的方法。
到目前为止,我已经找到了两个易于使用的软件包。一个是scipy linalg库(scipy.linalg.expm(A)),另一个是tensorflow linalg库(tf.linalg.expm(A))。如果已安装适当的cuda库,Tensorflow将使用GPU进行计算。可以合并两个库,而无需大幅度更改代码结构。 tensorflow软件包需要在numpy数组和tensorflow数组之间进行转换。这些操作涉及在系统RAM和GPU内存之间复制数据,这往往很昂贵。
对于大小小于12393的方阵,两个软件包都需要花费相同的时间来运行expm()函数,但是在numpy和tf数组之间进行转换时,tensorflow代码花费了更长的IO时间,并且总体上较慢。
CuPy还提供GPU计算能力,但是尚不存在可用于运行矩阵求幂的方法。与带cupy的GPU相比,使用numpy的CPU上的矩阵求逆运算也更快。
以上测试是在Linux机器上运行的,该机器使用的Intel®Core™i5-9400F CPU @ 2.90GHz×6和GeForce GTX 1050 Ti / PCIe / SSE2,使用的稀疏矩阵的大小为243至12393,基于128-位numpy复数。使用scipy.linalg.expm(A),对6个内核的5000x5000方阵(64位浮点数)求幂需要22秒。