python 中稀疏矩阵的矩阵幂
Matrix power for sparse matrix in 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这样的功能。
非常感谢任何帮助。提前致谢。
对于 numpy 矩阵,您也可以使用 **
表示法代替 matrix_power
:
a=np.matrix([[1,2],[2,1]])
a**3
输出:
matrix([[13, 14],
[14, 13]])
用 scipy 稀疏矩阵试试。
**
已针对 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
的总数。我认为这意味着 n=4
:
result = np.dot(M,M)
result = np.dot(result,result)
稀疏版本并不通用。它只能处理正整数幂。
您不能指望 numpy
函数在备用矩阵上运行。那些起作用的是将操作传递给数组自己的方法的那些。例如np.sum(A)
呼叫 A.sum()
.
我正在尝试找出一种方法来为稀疏矩阵 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这样的功能。 非常感谢任何帮助。提前致谢。
对于 numpy 矩阵,您也可以使用 **
表示法代替 matrix_power
:
a=np.matrix([[1,2],[2,1]])
a**3
输出:
matrix([[13, 14],
[14, 13]])
用 scipy 稀疏矩阵试试。
**
已针对 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
的总数。我认为这意味着 n=4
:
result = np.dot(M,M)
result = np.dot(result,result)
稀疏版本并不通用。它只能处理正整数幂。
您不能指望 numpy
函数在备用矩阵上运行。那些起作用的是将操作传递给数组自己的方法的那些。例如np.sum(A)
呼叫 A.sum()
.