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

3 vues (au cours des 30 derniers jours)
Szabolcs
Szabolcs le 1 Fév 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?

Réponse acceptée

James Tursa
James Tursa le 1 Fév 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++);
}
}
}

Plus de réponses (1)

Jan
Jan le 1 Fév 2013

Catégories

En savoir plus sur Write C Functions Callable from MATLAB (MEX Files) dans Help Center et File Exchange

Produits

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by