背景:我正在尝试建立一个实时鼓仿真模型,为此我需要非常快的矩阵向量乘积。我的矩阵大小约为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_sparse
,Vjk_minus_sparse
和Vj_mat
是稀疏的CSR矩阵,Vj
是numpy
数组,而Uj
是{ {1}}矩阵,其中每一行代表numpy
。 Uj(t)
是一个数组,它是一个静态end_gain
数组,用于衰减振动。
问题:numpy
的单次迭代大约需要3毫秒。最重要的
步骤是最后2行。它们合计大约需要2.5毫秒。理想情况下,我需要它在size = 4250
中运行,这可以使运行速度提高10倍以上。这是解决该问题可能的最大程度的矢量化,并且随着时间的推移,我无法并行化,至少从物理上讲这是不准确的。
尝试:我尝试摆弄稀疏的数据结构,并发现它们的最佳性能都是CSR(压缩稀疏行),其值如上所述。我还尝试通过重复Vj来用矩阵乘法替换0.1 ms
方法,但是这会使时间变差,因为结果运算将是稀疏*密集运算。
如何在python本身中加快速度?我也愿意尝试c ++,尽管现在迁移将是一个很大的痛苦。另外,由于multiply()
本质上是基于c的,它甚至可以提供这么多的加速吗?
添加了完整的可运行示例
scipy