I am trying to find out a way to do a matrix power for a sparse matrix M: M^k = M*...*M k times where * is the matrix multiplication (numpy.dot), and not element-wise multiplication.
I know how to do it for a normal matrix:
import numpy as np
import scipy as sp
M=(sp.sparse.spdiags(np.ones(N), 0, N, N)-sp.sparse.spdiags(np.ones(N), 2, N, N)).toarray()
How can I do it for sparse M:
M=(sp.sparse.spdiags(np.ones(N), 0, N, N)-sp.sparse.spdiags(np.ones(N), 2, N, N))
Of course, I can do this by recursive multiplications, but I am wondering if there is a functionality like matrix_power for sparse matrices in scipy. Any help is much much appreciated. Thanks in advance.
Best How To :
** has been implemented for
csr_matrix. There is a
After handling some special cases this
tmp = self.__pow__(other//2)
if (other % 2):
return self * tmp * tmp
return tmp * tmp
For sparse matrix,
* is the matrix product (
dot for ndarray). So it is doing recursive multiplications.
np.matrix also implements
__pow__) as matrix power. In fact it ends up calling
np.linalg.matrix_power(M, n) is written in Python, so you can easily see what it does.
n<=3 is just does the repeated
n, it does a binary decomposition to reduce the total number of
dots. I assume that means for
result = np.dot(M,M)
result = np.dot(result,result)
The sparse version isn't as general. It can only handle positive integer powers.
You can't count on
numpy functions operating on spare matrices. The ones that do work are the ones that pass the action on to the array's own method. e.g.