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