Clear Filters
Clear Filters

Sparse Matrix Multiplication

5 views (last 30 days)
Abhishek
Abhishek on 20 May 2012
Hi,
I know there are many mex based routines are available for sparse matrix multiplication (such as SSMULT), however, I am writing my own as a part of mex exercise. Here is the code that I have written.
#include "mex.h"
int scatter(mxArray *A,int j,double beta,int *w,double *x,int mark,mxArray *C,int nz)
{
mwIndex *Ap,*Ai,*Ci;
int i,p;
double *Ax = mxGetPr(A);
Ap = mxGetJc(A);
Ai = mxGetIr(A);
Ci = mxGetIr(C);
for(p = Ap[j]; p < Ap[j+1];p++)
{
i = Ap[p];
if(w[i] < mark)
{
w[i] = mark;
Ci[nz++] = i;
if(x)
{
x[i] = beta * Ax[p];
}
}
else if(x)
{
x[i] += beta * Ax[p];
}
}
return nz;
}
void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])
{
double *A,*B;
mxArray *temp,*C;
A = mxGetPr(prhs[0]);
B = mxGetPr(prhs[1]);
int i,j,nz = 0;
int m_a = mxGetM(prhs[0]);
int n_a = mxGetN(prhs[0]);
int m_b = mxGetM(prhs[1]);
int n_b = mxGetN(prhs[1]);
mwIndex *jc_a,*ir_a,*jc_b,*ir_b,*ir,*jc;
jc_a = mxGetJc(prhs[0]);
ir_a = mxGetIr(prhs[0]);
jc_b = mxGetJc(prhs[1]);
ir_b = mxGetIr(prhs[1]);
int m = m_a;
int anz = jc[n_a];
int values = (mxGetPr(prhs[0]) != NULL) && (mxGetPr(prhs[1]) !=NULL);
int n = n_b;
int bnz = jc_b[n];
int *w = (int*) mxMalloc(m*sizeof(int));
double *x = (double *) mxMalloc(m*sizeof(double));
double *Cx = mxGetPr(C);
temp = mxCreateSparse(m_a,n_a,anz,mxREAL);
mxSetPr(temp,A);
C = mxCreateSparse(m,n,anz+bnz,mxREAL);
jc = mxGetJc(C);
ir = mxGetIr(C);
for(j = 0;j < n;j++)
{
jc[j] = nz;
for(i = ir_b[j]; i < ir_b [j+1]; j++)
{
nz = scatter(temp,ir_b[i],B ? B[i] : 1,w,x,j+1,C,nz);
}
if(values)
{
for(i = jc[j]; i < nz;i++)
{
Cx[i] = x[ir[i]];
}
}
}
jc[n] = nz;
mwSize ni, nrow;
int y,z;
double *pr;
if( !mxIsSparse(C) )
{
mexPrintf("Error in calculation");
return;
}
else
{
ni = mxGetN(C);
pr = mxGetPr(C);
for( y=0; y<n; y++ ) {
nrow = jc[y+1] - jc[y];
for( z=0; z<nrow; z++ ) {
mexPrintf(" (%d,%d) %g\n",(*ir++)+1,y+1,*pr++);
}
}
}
mxFree(x);
mxFree(w);
}
However, whenever I run this code by giving two sparse matrices as input, it just crashes (and possibly gives segmentation fault).
I am using cs_mult and scatter methods of SSMULT library as my baseline algorithms.
Kindly help guys. Cheers.

Answers (0)

Categories

Find more on Sparse Matrices in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!