How do I calculate the matrix exponential of a sparse matrix?

Question:

I’m trying to find the matrix exponential of a sparse matrix:

import numpy as np

b = np.array([[1, 0, 1, 0, 1, 0, 1, 1, 1, 0],
       [1, 0, 0, 0, 1, 1, 0, 1, 1, 0],
       [0, 1, 1, 0, 1, 1, 0, 0, 1, 1],
       [0, 0, 0, 0, 0, 1, 1, 1, 0, 0],
       [1, 1, 0, 0, 0, 0, 1, 0, 0, 0],
       [0, 0, 1, 0, 0, 1, 0, 0, 1, 1],
       [0, 0, 1, 0, 1, 0, 1, 1, 0, 0],
       [1, 0, 0, 0, 1, 1, 0, 0, 1, 1],
       [0, 0, 0, 0, 1, 0, 1, 1, 1, 0],
       [0, 0, 0, 1, 0, 1, 1, 0, 0, 1]])

I can calculate this using scipy.linalg.expm, but it is slow for larger matrices.

from scipy.linalg import expm

S1 = expm(b)

Since this is a sparse matrix, I tried converting b to a scipy.sparse matrix and calling that function on the converted sparse matrix:

import scipy.sparse as sp
import numpy as np

sp_b = sp.csr_matrix(b)
S1 = expm(sp_b);

But I get the following error:

loop of ufunc does not support argument 0 of type csr_matrix which has no callable exp method

How can I calculate the matrix exponential of a sparse matrix?

Asked By: cerv21

||

Answers:

You need to use scipy.sparse.linalg.expm for your sparse matrix instead of scipy.linalg.expm.

import scipy.sparse as sp
from scipy.sparse.linalg import expm
import numpy as np

b = np.array([[1, 0, 1, 0, 1, 0, 1, 1, 1, 0],
       [1, 0, 0, 0, 1, 1, 0, 1, 1, 0],
       [0, 1, 1, 0, 1, 1, 0, 0, 1, 1],
       [0, 0, 0, 0, 0, 1, 1, 1, 0, 0],
       [1, 1, 0, 0, 0, 0, 1, 0, 0, 0],
       [0, 0, 1, 0, 0, 1, 0, 0, 1, 1],
       [0, 0, 1, 0, 1, 0, 1, 1, 0, 0],
       [1, 0, 0, 0, 1, 1, 0, 0, 1, 1],
       [0, 0, 0, 0, 1, 0, 1, 1, 1, 0],
       [0, 0, 0, 1, 0, 1, 1, 0, 0, 1]])
sp_b = sp.csr_matrix(b)
S1 = expm(sp_b);

Note: As you found, defining your matrix as a CSR matrix gives the warning "SparseEfficiencyWarning: spsolve is more efficient when sparse b is in the CSC matrix format". To get rid of this, you can do as the warning suggests, and define a CSC matrix if that makes sense for your application:

sp_b = sp.csc_matrix(b)
Answered By: Pranav Hosangadi
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.