Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

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

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:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

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?

>Solution :

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)
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading