2015-02-24 174 views
2

我想找出一种方法来做一个稀疏矩阵M的矩阵功率:M^k = M * ... * M k次其中*是矩阵乘法(numpy .dot)和而不是按元素乘法python稀疏矩阵的矩阵功率

我知道该怎么做一个正常的矩阵:

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) 

我该怎么办呢稀疏L:

M=(sp.sparse.spdiags(np.ones(N), 0, N, N)-sp.sparse.spdiags(np.ones(N), 2, N, N)) 

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

回答

2

**已执行csr_matrix。有一个__pow__方法。

处理一些特殊情况下,这确实__pow__后:

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

对于稀疏矩阵,*是矩阵产品(dot为ndarray)。所以它正在做递归乘法。


math指出,np.matrix还实现**__pow__)作为基质的功率。事实上,它最终称为np.linalg.matrix_power

np.linalg.matrix_power(M, n)是用Python编写的,所以你可以很容易地看到它的功能。

对于n<=3只是做了重复dot

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

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

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

您不能指望numpy在备用矩阵上运行的功能。那些能够工作的人就是那些将行为传递给数组自己的方法的人。例如np.sum(A)调用A.sum()

+0

感谢您的详细解释。 – JRun 2015-02-28 14:10:55

+0

如果你有布尔稀疏矩阵并且计算传递闭包(连通性),你可能想看看这个:https://ac.els-cdn.com/S0304397505008546/1-s2.0-S0304397505008546-main pdf格式?_tid = 4cf2407e-de8f-11E7-b0b6-00000aacb35f&acdnat = 1513009451_9b447acd7a2c71ea8521617899e4600b – 2017-12-11 16:35:21

2

您还可以使用**符号代替matrix_power为numpy的矩阵:

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

日期:

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

尝试与SciPy的稀疏矩阵。