【问题标题】:Faster Matrix-Vector-Multiplication (MVM) if the matrix elements are computed on-the-fly如果矩阵元素是即时计算的,则更快的矩阵向量乘法 (MVM)
【发布时间】:2020-04-09 08:10:03
【问题描述】:

我目前正在开展一个项目,我必须使用 Lanczos 算法计算极值特征值。我替换了 MVM,以便即时计算矩阵元素,因为我必须计算真正巨大矩阵的特征值。这会减慢我的代码速度,因为 python 中的 for 循环比 MVM 慢。有什么方法可以简单地改进我的代码吗?我尝试使用 Cython,但在这里我没有真正的运气。

for i in range(0,dim):
        for j in range(0,dim):
            temp=get_Matrix_Element(i,j)
            ws[i]=ws[i]+temp*v[j]

这替换:

ws = M.dot(v)

更新 ,atrix M 是稀疏的,可以使用 scipy.sparse 以稀疏矩阵格式存储“小型”系统。对于高达 ~10^9 维的大型系统,我需要即时计算矩阵元素

【问题讨论】:

  • 但是,我刚刚注意到一个标签 [sparse-matrix]。实际上,您的矩阵是稀疏的吗?如果是这样,你如何存储它?
  • @AntonMenshov 我使用的矩阵确实是稀疏的。对于“小型”系统,使用 scipy.sparse 以稀疏矩阵格式保存 M 是可行的。但我想获得高达 ~10^9 维的大型系统的特征值。这就是我即时计算元素的原因
  • 那么,我想,我提出的方法是有道理的。

标签: python sparse-matrix linear-algebra matrix-multiplication


【解决方案1】:

最简单快速实施的解决方案是半途而废:一次预计算一行。

在您的原始解决方案 (M.dot(v)) 中,您必须存储以二次方增长的 dim x dim。如果您预先计算一行,它会线性缩放,不会给您带来麻烦(因为您已经存储了相同大小的结果向量 ws)。

代码应该是这样的:

for i in range(0,dim):
    temp=get_Matrix_Row(i)
        ws[i]=temp.dot(v)

其中temp 现在是dim x 1 向量。

此类修改应允许在dot 产品期间进行更多优化,而无需进行重大代码修改。

【讨论】:

  • 但是 get_Matrix_Row(i) 函数将具有线性运行时,因为它是在 for 循环中调用的,所以我会遇到同样的问题。我知道我的代码速度较慢,因为我即时计算矩阵元素。但是我想解决python for-loop的瓶颈。
  • @Sephka,您仍然需要计算矩阵的所有条目 (deg*deg)。我建议使用一种对缓存更友好且#function 调用更友好的方法,您还可以在 get_Matrix_row() 函数中节省一些小成本。
  • 当然。一开始我误解了。我实现了你的方法并将速度提高了一倍。我现在将尝试进一步优化它。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 2021-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多