8

I've a Sparse matrix in CSR Sparse format in python and I want to import it to MATLAB. MATLAB does not have a CSR Sparse format. It has only 1 Sparse format for all kind of matrices. Since the matrix is very large in the dense format I was wondering how could I import it as a MATLAB sparse matrix?

0

2 Answers 2

6

The scipy.io.savemat saves sparse matrices in a MATLAB compatible format:

In [1]: from scipy.io import savemat, loadmat
In [2]: from scipy import sparse
In [3]: M = sparse.csr_matrix(np.arange(12).reshape(3,4))
In [4]: savemat('temp', {'M':M})

In [8]: x=loadmat('temp.mat')
In [9]: x
Out[9]: 
{'M': <3x4 sparse matrix of type '<type 'numpy.int32'>'
    with 11 stored elements in Compressed Sparse Column format>,
 '__globals__': [],
 '__header__': 'MATLAB 5.0 MAT-file Platform: posix, Created on: Mon Sep  8 09:34:54 2014',
 '__version__': '1.0'}

In [10]: x['M'].A
Out[10]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

Note that savemat converted it to csc. It also transparently takes care of the index starting point difference.

And in Octave:

octave:4> load temp.mat
octave:5> M
M =
Compressed Column Sparse (rows = 3, cols = 4, nnz = 11 [92%])
  (2, 1) ->  4
  (3, 1) ->  8
  (1, 2) ->  1
  (2, 2) ->  5
  ...

octave:8> full(M)
ans =    
    0    1    2    3
    4    5    6    7
    8    9   10   11
Sign up to request clarification or add additional context in comments.

1 Comment

Thanks. This is the direct approach.
4

The Matlab and Scipy sparse matrix formats are compatible. You need to get the data, indices and matrix size of the matrix in Scipy and use them to create a sparse matrix in Matlab. Here's an example:

from scipy.sparse import csr_matrix
from scipy import array

# create a sparse matrix
row = array([0,0,1,2,2,2])
col = array([0,2,2,0,1,2])
data = array([1,2,3,4,5,6])

mat = csr_matrix( (data,(row,col)), shape=(3,4) )

# get the data, shape and indices
(m,n) = mat.shape
s = mat.data
i = mat.tocoo().row
j = mat.indices

# display the matrix
print mat

Which prints out:

  (0, 0)        1
  (0, 2)        2
  (1, 2)        3
  (2, 0)        4
  (2, 1)        5
  (2, 2)        6

Use the values m, n, s, i, and j from Python to create a matrix in Matlab:

m = 3;
n = 4;
s = [1, 2, 3, 4, 5, 6];
% Index from 1 in Matlab.
i = [0, 0, 1, 2, 2, 2] + 1;
j = [0, 2, 2, 0, 1, 2] + 1;

S = sparse(i, j, s, m, n, m*n)

Which gives the same Matrix, only indexed from 1.

   (1,1)        1
   (3,1)        4
   (3,2)        5
   (1,3)        2
   (2,3)        3
   (3,3)        6

1 Comment

Thanks. Just a small suggested modification. for the last (sixth) argument of the sparse command, we could use the result of nnz method instead of m*n to save space (or simply omit it and pass 5 arguments which would have the same effect).

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.