scipy.linalg.expm相对于scipy.sparse.linalgexpm的优势



我很难理解什么时候使用expm的稀疏版本比常规版本更好。

如果我取一个大小为4000 x 4000矩阵的稠密矩阵M,它恰好是稀疏的,并计算scipy.linalg.expm(M),这大约需要25秒。如果我接着做M_sparse = sparse.csc_matrix(M)并计算scipy.sparse.linalg.expm(M_sparse),这将运行至少10分钟。

scipy.sparse.linalg.expm的正确用例是什么?它适用于更大的矩阵吗?

scipy.linalg.expm使用sparse.linalg.expm。看看它的来源:

Signature: linalg.expm(A)
Source:   
def expm(A):
import scipy.sparse.linalg
return scipy.sparse.linalg.expm(A)

我们也可以查看稀疏源,尽管这要长得多,因为它正在做真正的工作。它还处理了许多不同的情况,包括不同程度的Pade近似。你可能需要仔细阅读这个近似值。如果我没记错的话,它涉及一个反命题。

当你说你的数组是"稀疏的"时,你到底是什么意思?已经是scipy.sparse.csr矩阵了吗?还是一个有很多0的ndarray?0(或非零(的比例是多少?稀疏度是50%还是5%?当使用scipy.sparse矩阵时,稀疏性非常重要。并且(40004000(对于大多数sparse的使用来说是小的。密集版本将适合内存,并且通常计算速度更快。

我的猜测是,如果存在时间差,那是因为使用了稀疏矩阵与ndarray,而不是调用函数。

(40004000(阵列上的expm速度相当慢。

稀疏和密集的常见算法的原因只是历史原因。

情况将在1.9版中通过https://github.com/scipy/scipy/pull/15079然后稀疏阵列将使用CCD_ 16版本,而密集阵列将通过CCD_。典型的区别是,如果没有超大的内存硬件,你就无法提供25000x25000的密集矩阵,但如果你的阵列中存在稀疏性,并创建一个适合内存的稀疏阵列,那么你可以使用不使用密集算法的稀疏版本,特别是矩阵幂、范数估计和matvec运算。

有了这个PR,它将进一步加速密集版本,尤其是高达10倍的较小矩阵,还将处理堆叠的numpy数组。

计划对所有矩阵函数solveeig进行全面检修,以统一API并提高可用性。

最新更新