编程语言
首页 > 编程语言> > python中稀疏矩阵的矩阵幂

python中稀疏矩阵的矩阵幂

作者:互联网

我试图找到一种方法为稀疏矩阵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这样的稀疏矩阵的功能.
任何帮助都非常感谢.提前致谢.

解决方法:

**已针对csr_matrix实施.有一个__pow__方法.

在处理了一些特殊情况之后__pow__:

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

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

正如数学所指出的那样,np.matrix也实现了**(__ cat__)作为矩阵幂.实际上它最终会调用np.linalg.matrix_power.

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

对于n <= 3,只是重复的点. 对于较大的n,它进行二进制分解以减少点的总数.我假设n = 4的意思是:

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

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

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

标签:python,numpy,scipy,sparse-matrix,linear-algebra
来源: https://codeday.me/bug/20190929/1833119.html