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