如果实时计算矩阵元素,则更快的矩阵向量乘法 (MVM)
Faster Matrix-Vector-Multiplication (MVM) if the matrix elements are computed on-the-fly
我目前正在开展一个项目,我必须使用 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)
更新
矩阵 M 是稀疏的,可以使用 scipy.sparse 以稀疏矩阵格式为 "small" 系统存储。对于高达 ~10^9 维的大型系统,我需要即时计算矩阵元素
最简单快速的解决方案是半途而废:一次预计算一行。
在您的原始解决方案 (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
产品期间进行更多优化,而无需主要代码修改。
我目前正在开展一个项目,我必须使用 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)
更新 矩阵 M 是稀疏的,可以使用 scipy.sparse 以稀疏矩阵格式为 "small" 系统存储。对于高达 ~10^9 维的大型系统,我需要即时计算矩阵元素
最简单快速的解决方案是半途而废:一次预计算一行。
在您的原始解决方案 (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
产品期间进行更多优化,而无需主要代码修改。