MATLAB Answers


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

Asked by Szabolcs
on 1 Feb 2013

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?



2 Answers

Answer by James Tursa
on 1 Feb 2013
 Accepted answer

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++);


Discover MakerZone

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

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

MATLAB Academy

New to MATLAB?

Learn MATLAB today!