wolffd@0: /* This is based on wolffd@0: http://www.mathworks.com/access/helpdesk/help/techdoc/matlab_external/ch04cr12.shtml wolffd@0: wolffd@0: See rectintSparse.m for the matlab version of this code. wolffd@0: wolffd@0: */ wolffd@0: wolffd@0: #include /* Needed for the ceil() prototype. */ wolffd@0: #include "mex.h" wolffd@0: #include wolffd@0: wolffd@0: /* If you are using a compiler that equates NaN to be zero, you wolffd@0: * must compile this example using the flag -DNAN_EQUALS_ZERO. wolffd@0: * For example: wolffd@0: * wolffd@0: * mex -DNAN_EQUALS_ZERO fulltosparse.c wolffd@0: * wolffd@0: * This will correctly define the IsNonZero macro for your C wolffd@0: * compiler. wolffd@0: */ wolffd@0: wolffd@0: #if defined(NAN_EQUALS_ZERO) wolffd@0: #define IsNonZero(d) ((d) != 0.0 || mxIsNaN(d)) wolffd@0: #else wolffd@0: #define IsNonZero(d) ((d) != 0.0) wolffd@0: #endif wolffd@0: wolffd@0: #define MAX(x,y) ((x)>(y) ? (x) : (y)) wolffd@0: #define MIN(x,y) ((x)<(y) ? (x) : (y)) wolffd@0: wolffd@0: void mexFunction( wolffd@0: int nlhs, mxArray *plhs[], wolffd@0: int nrhs, const mxArray *prhs[] wolffd@0: ) wolffd@0: { wolffd@0: /* Declare variables. */ wolffd@0: int j,k,m,n,nzmax,*irs,*jcs, *irs2, *jcs2; wolffd@0: double *overlap, *overlap2, tmp, areaA, areaB; wolffd@0: double percent_sparse; wolffd@0: double *leftA, *rightA, *topA, *bottomA; wolffd@0: double *leftB, *rightB, *topB, *bottomB; wolffd@0: double *verbose; wolffd@0: wolffd@0: /* Get the size and pointers to input data. */ wolffd@0: m = MAX(mxGetM(prhs[0]), mxGetN(prhs[0])); wolffd@0: n = MAX(mxGetM(prhs[4]), mxGetN(prhs[4])); wolffd@0: /* printf("A=%d, B=%d\n", m, n); */ wolffd@0: wolffd@0: leftA = mxGetPr(prhs[0]); wolffd@0: rightA = mxGetPr(prhs[1]); wolffd@0: topA = mxGetPr(prhs[2]); wolffd@0: bottomA = mxGetPr(prhs[3]); wolffd@0: wolffd@0: leftB = mxGetPr(prhs[4]); wolffd@0: rightB = mxGetPr(prhs[5]); wolffd@0: topB = mxGetPr(prhs[6]); wolffd@0: bottomB = mxGetPr(prhs[7]); wolffd@0: wolffd@0: verbose = mxGetPr(prhs[8]); wolffd@0: wolffd@0: /* Allocate space for sparse matrix. wolffd@0: * NOTE: Assume at most 20% of the data is sparse. Use ceil wolffd@0: * to cause it to round up. wolffd@0: */ wolffd@0: wolffd@0: percent_sparse = 0.01; wolffd@0: nzmax = (int)ceil((double)m*(double)n*percent_sparse); wolffd@0: wolffd@0: plhs[0] = mxCreateSparse(m,n,nzmax,0); wolffd@0: overlap = mxGetPr(plhs[0]); wolffd@0: irs = mxGetIr(plhs[0]); wolffd@0: jcs = mxGetJc(plhs[0]); wolffd@0: wolffd@0: plhs[1] = mxCreateSparse(m,n,nzmax,0); wolffd@0: overlap2 = mxGetPr(plhs[1]); wolffd@0: irs2 = mxGetIr(plhs[1]); wolffd@0: jcs2 = mxGetJc(plhs[1]); wolffd@0: wolffd@0: wolffd@0: /* Assign nonzeros. */ wolffd@0: k = 0; wolffd@0: for (j = 0; (j < n); j++) { wolffd@0: int i; wolffd@0: jcs[j] = k; wolffd@0: jcs2[j] = k; wolffd@0: for (i = 0; (i < m); i++) { wolffd@0: tmp = (MAX(0, MIN(rightA[i], rightB[j]) - MAX(leftA[i], leftB[j]) )) * wolffd@0: (MAX(0, MIN(topA[i], topB[j]) - MAX(bottomA[i], bottomB[j]) )); wolffd@0: wolffd@0: if (*verbose) { wolffd@0: printf("j=%d,i=%d,tmp=%5.3f\n", j,i,tmp); wolffd@0: } wolffd@0: wolffd@0: if (IsNonZero(tmp)) { wolffd@0: wolffd@0: /* Check to see if non-zero element will fit in wolffd@0: * allocated output array. If not, increase wolffd@0: * percent_sparse by 20%, recalculate nzmax, and augment wolffd@0: * the sparse array. wolffd@0: */ wolffd@0: if (k >= nzmax) { wolffd@0: int oldnzmax = nzmax; wolffd@0: percent_sparse += 0.2; wolffd@0: nzmax = (int)ceil((double)m*(double)n*percent_sparse); wolffd@0: wolffd@0: /* Make sure nzmax increases atleast by 1. */ wolffd@0: if (oldnzmax == nzmax) wolffd@0: nzmax++; wolffd@0: printf("reallocating from %d to %d\n", oldnzmax, nzmax); wolffd@0: wolffd@0: mxSetNzmax(plhs[0], nzmax); wolffd@0: mxSetPr(plhs[0], mxRealloc(overlap, nzmax*sizeof(double))); wolffd@0: mxSetIr(plhs[0], mxRealloc(irs, nzmax*sizeof(int))); wolffd@0: overlap = mxGetPr(plhs[0]); wolffd@0: irs = mxGetIr(plhs[0]); wolffd@0: wolffd@0: mxSetNzmax(plhs[1], nzmax); wolffd@0: mxSetPr(plhs[1], mxRealloc(overlap2, nzmax*sizeof(double))); wolffd@0: mxSetIr(plhs[1], mxRealloc(irs2, nzmax*sizeof(int))); wolffd@0: overlap2 = mxGetPr(plhs[1]); wolffd@0: irs2 = mxGetIr(plhs[1]); wolffd@0: } wolffd@0: wolffd@0: overlap[k] = tmp; wolffd@0: irs[k] = i; wolffd@0: wolffd@0: areaA = (rightA[i]-leftA[i])*(topA[i]-bottomA[i]); wolffd@0: areaB = (rightB[j]-leftB[j])*(topB[j]-bottomB[j]); wolffd@0: overlap2[k] = MIN(tmp/areaA, tmp/areaB); wolffd@0: irs2[k] = i; wolffd@0: wolffd@0: k++; wolffd@0: } /* IsNonZero */ wolffd@0: } /* for i */ wolffd@0: } wolffd@0: jcs[n] = k; wolffd@0: jcs2[n] = k; wolffd@0: wolffd@0: } wolffd@0: wolffd@0: wolffd@0: wolffd@0: wolffd@0: wolffd@0: wolffd@0: wolffd@0: