在Python中执行稀疏矩阵乘法的最快方法

时间:2019-04-19 07:26:21

标签: python numpy matrix scipy sparse-matrix

背景:我正在尝试建立一个实时鼓仿真模型,为此我需要非常快的矩阵向量乘积。我的矩阵大小约为5000-10000行/列,其中每行只有6个条目为非零,因此我倾向于使用稀疏矩阵。我正在使用scipy.sparse模块。迭代如下。

Vjk_plus_sparse = Vjk_minus_sparse.transpose()
Vj = Vjk_plus_sparse.dot(constant)
np.put(Vj, Nr, 0.0)
Uj[t] = Uj[t-1] + np.transpose(Vj)/fs
Vj_mat = adj_mat_sparse.multiply(Vj)
Vjk_minus_sparse = Vj_mat-Vjk_plus_sparse.multiply(end_gain)

此处,Vjk_plus_sparseVjk_minus_sparseVj_mat是稀疏的CSR矩阵,Vjnumpy数组,而Uj是{ {1}}矩阵,其中每一行代表numpyUj(t)是一个数组,它是一个静态end_gain数组,用于衰减振动。

问题:numpy的单次迭代大约需要3毫秒。最重要的 步骤是最后2行。它们合计大约需要2.5毫秒。理想情况下,我需要它在size = 4250中运行,这可以使运行速度提高10倍以上。这是解决该问题可能的最大程度的矢量化,并且随着时间的推移,我无法并行化,至少从物理上讲这是不准确的。

尝试:我尝试摆弄稀疏的数据结构,并发现它们的最佳性能都是CSR(压缩稀疏行),其值如上所述。我还尝试通过重复Vj来用矩阵乘法替换0.1 ms方法,但是这会使时间变差,因为结果运算将是稀疏*密集运算。

如何在python本身中加快速度?我也愿意尝试c ++,尽管现在迁移将是一个很大的痛苦。另外,由于multiply()本质上是基于c的,它甚至可以提供这么多的加速吗?

添加了完整的可运行示例

scipy

0 个答案:

没有答案