## Sparse matrices: find indices of non-zero elements in C code

on 1 Feb 2013

### James Tursa (view profile)

I am using the MATLAB Engine interface, and I need to be able to handle sparse matrices.

Starting with an mxArray pointer which turns out to be a sparse matrix, is there an easy way to find the indices and values of non-zero matrix elements---all in C code without calling back to MATLAB?

What I have easy access to is the IR and JC arrays. Are there any functions provided to compute from these the index and value lists?

## Products

### James Tursa (view profile)

on 1 Feb 2013

Here is a simple mex routine that mimics the display functionality for sparse matrices (prints only the non-zero values). You should be able to easily extract the indexing code you need from this. The code prints out indexes in 1-based indexing for display purposes, but if you need 0-based indexing an easy -1 adjustment can be made to the code.

```#include "mex.h"
```
```void spprint(const mxArray *mx);
```
```void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
if( nrhs ) spprint(prhs[0]);
}
```
```void spprint(const mxArray *mx)
{
mwSize n, nrow;
mwIndex *ir, *jc;
mwIndex j, x, y;
double *pr;
```
```      if( !(mx && mxIsSparse(mx) && mxIsDouble(mx)) ) return;
n = mxGetN(mx);
pr = mxGetData(mx);
ir = mxGetIr(mx);
jc = mxGetJc(mx);```
```      for( y=0; y<n; y++ ) {
nrow = jc[y+1] - jc[y];
for( x=0; x<nrow; x++ ) {
mexPrintf("   (%d,%d)    %g\n",(*ir++)+1,y+1,*pr++);
}
}
}```

### Jan Simon (view profile)

on 1 Feb 2013

Searching in the net is a good point to start from. e.g. Google finds:

#### Join the 15-year community celebration.

Play games and win prizes!

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi