scipy.sparse.linalg.expm_multiply 与稀疏与非稀疏向量的效率

计算科学 线性代数 Python 矩阵 稀疏矩阵 scipy
2021-12-14 20:22:19

scipy.sparse.linalg在 Python 中的包中,调用expm_multiply(X, v)允许您以expm(X)@v非常有效的方式计算向量。X此外,当是稀疏数据类型(如csr_matrixor csc_matrix时,此函数效果最佳。但是,我发现当是稀疏数据类型时,与当是 a 时相比,此函数的工作速度较慢参见下面的示例)。vvnumpy.ndarray

这导致了几个问题。第一:为什么不是稀疏数据类型expm_multiply(X, v)时最有效v,即使X应该是稀疏的?第二:我是否应该将此视为一般属性 - 如果效率很重要,我通常不应该将向量转换为稀疏数据类型?


一些显示发生了什么的示例代码如下:

import numpy as np
from numpy.random import uniform
from time import process_time
from scipy import linalg
from scipy import sparse
from scipy.sparse import linalg

dim = pow(2, 12)

#create vector where most elements are 0
v = np.zeros(dim)
for i in range(len(v)):
    if i%50 == 0:
        v[i] = uniform(-1, 1)
        
#create matrix where most elements are 0
X = np.zeros([dim,dim])
for i in range(len(v)):
    for j in range(len(v)):
        if i%50 ==0 and (j+1)%50 == 0:
            X[i][j] = uniform(-1, 1)
            
Xsparse = sparse.csr_matrix(X)
vsparse = sparse.csr_matrix(v).T

#compare sparse vs unsparse exp(X)v calculation
start = process_time()
A = sparse.linalg.expm_multiply(Xsparse, v)
print(process_time() - start)

start = process_time()
B = sparse.linalg.expm_multiply(Xsparse, vsparse)
print(process_time() - start)

这将产生如下输出:

0.0019309999999990168
0.01379999999999626

因此 usingvsparse大约比 using 长一个数量级v

1个回答

通常,并非总是,但通常,即使两者都Ax稀疏,Ax不是。即使它是,它比x. 如果你考虑类似eAx, 可以改写为(I+A+A2/2+)x,不能保证它具有相同的稀疏模式或相同数量的非零值x. 这意味着 scipy 要么必须不断地重新分配内存,要么必须将稀疏向量转换为密集向量。在如此小的例子中,这可以解释数量级的差异。