python中稀疏矩阵的矩阵幂

时间:2015-02-24 17:30:53

标签: python numpy scipy linear-algebra sparse-matrix

我试图找到一种为稀疏矩阵M做矩阵幂的方法:M ^ k = M * ... * M k次其中*是矩阵乘法(numpy.dot),和不是元素乘法

我知道如何为普通矩阵做到这一点:

import numpy as np
import scipy as sp
N=100
k=3
M=(sp.sparse.spdiags(np.ones(N), 0, N, N)-sp.sparse.spdiags(np.ones(N), 2, N, N)).toarray()
np.matrix_power(M,k)

如何为稀疏M:

做到这一点
M=(sp.sparse.spdiags(np.ones(N), 0, N, N)-sp.sparse.spdiags(np.ones(N), 2, N, N))

当然,我可以通过递归乘法来做到这一点,但我想知道在scipy中是否存在像matrix_power这样的稀疏矩阵的功能。 任何帮助都非常感谢。提前谢谢。

2 个答案:

答案 0 :(得分:2)

您也可以使用**表示法代替matrix_power表示numpy矩阵:

a=np.matrix([[1,2],[2,1]])
a**3

出:

matrix([[13, 14],
        [14, 13]])

用scipy稀疏矩阵试试。

答案 1 :(得分:2)

**已针对csr_matrix实施。有__pow__方法。

在处理了一些特殊情况后,__pow__会这样做:

            tmp = self.__pow__(other//2)
            if (other % 2):
                return self * tmp * tmp
            else:
                return tmp * tmp

对于稀疏矩阵,*是矩阵乘积(ndarray的dot)。所以它正在进行递归乘法。


正如math所述,np.matrix也将**__pow__)实现为矩阵幂。事实上,它最终会调用np.linalg.matrix_power

np.linalg.matrix_power(M, n)是用Python编写的,因此您可以轻松查看它的作用。

n<=3而言,重复的是dot

对于较大的n,它会进行二进制分解以减少dot的总数。我认为这意味着n=4

result = np.dot(M,M)
result = np.dot(result,result)

稀疏版本不是一般的。它只能处理正整数幂。

您不能指望在备用矩阵上运行的numpy函数。那些有效的是那些将动作传递给数组自己的方法的人。例如np.sum(A)致电A.sum()