00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include <math.h>
00018 #include "mex.h"
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #if defined(NAN_EQUALS_ZERO)
00029 #define IsNonZero(d) ((d)!=0.0 || mxIsNaN(d))
00030 #else
00031 #define IsNonZero(d) ((d)!=0.0)
00032 #endif
00033
00034 void mexFunction(
00035 int nlhs, mxArray *plhs[],
00036 int nrhs, const mxArray *prhs[]
00037 )
00038 {
00039
00040 mwSize m,n;
00041 mwSize nzmax;
00042 mwIndex *irs,*jcs,j,k;
00043 int cmplx,isfull;
00044 double *pr,*pi,*si,*sr;
00045 double percent_sparse;
00046
00047
00048 if (nrhs != 1) {
00049 mexErrMsgTxt("One input argument required.");
00050 }
00051 if(nlhs > 1){
00052 mexErrMsgTxt("Too many output arguments.");
00053 }
00054
00055
00056 if (!(mxIsDouble(prhs[0]))){
00057 mexErrMsgTxt("Input argument must be of type double.");
00058 }
00059
00060 if (mxGetNumberOfDimensions(prhs[0]) != 2){
00061 mexErrMsgTxt("Input argument must be two dimensional\n");
00062 }
00063
00064
00065 m = mxGetM(prhs[0]);
00066 n = mxGetN(prhs[0]);
00067 pr = mxGetPr(prhs[0]);
00068 pi = mxGetPi(prhs[0]);
00069 cmplx = (pi==NULL ? 0 : 1);
00070
00071
00072
00073
00074
00075
00076 percent_sparse = 0.2;
00077 nzmax=(mwSize)ceil((double)m*(double)n*percent_sparse);
00078
00079 plhs[0] = mxCreateSparse(m,n,nzmax,cmplx);
00080 sr = mxGetPr(plhs[0]);
00081 si = mxGetPi(plhs[0]);
00082 irs = mxGetIr(plhs[0]);
00083 jcs = mxGetJc(plhs[0]);
00084
00085
00086 k = 0;
00087 isfull=0;
00088 for (j=0; (j<n); j++) {
00089 mwSize i;
00090 jcs[j] = k;
00091 for (i=0; (i<m ); i++) {
00092 if (IsNonZero(pr[i]) || (cmplx && IsNonZero(pi[i]))) {
00093
00094
00095
00096
00097
00098 if (k>=nzmax){
00099 mwSize oldnzmax = nzmax;
00100 percent_sparse += 0.1;
00101 nzmax = (mwSize)ceil((double)m*(double)n*percent_sparse);
00102
00103
00104 if (oldnzmax == nzmax)
00105 nzmax++;
00106
00107 mxSetNzmax(plhs[0], nzmax);
00108 mxSetPr(plhs[0], mxRealloc(sr, nzmax*sizeof(double)));
00109 if(si != NULL)
00110 mxSetPi(plhs[0], mxRealloc(si, nzmax*sizeof(double)));
00111 mxSetIr(plhs[0], mxRealloc(irs, nzmax*sizeof(mwIndex)));
00112
00113 sr = mxGetPr(plhs[0]);
00114 si = mxGetPi(plhs[0]);
00115 irs = mxGetIr(plhs[0]);
00116 }
00117 sr[k] = pr[i];
00118 if (cmplx){
00119 si[k]=pi[i];
00120 }
00121 irs[k] = i;
00122 k++;
00123 }
00124 }
00125 pr += m;
00126 pi += m;
00127 }
00128 jcs[n] = k;
00129 }
00130