wolffd@0: wolffd@0: m = mxGetM(prhs[0]); wolffd@0: n = mxGetN(prhs[0]); wolffd@0: pr = mxGetPr(prhs[0]); wolffd@0: pi = mxGetPi(prhs[0]); wolffd@0: cmplx = (pi == NULL ? 0 : 1); 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.2; wolffd@0: nzmax = (int)ceil((double)m*(double)n*percent_sparse); wolffd@0: wolffd@0: plhs[0] = mxCreateSparse(m,n,nzmax,cmplx); wolffd@0: sr = mxGetPr(plhs[0]); wolffd@0: si = mxGetPi(plhs[0]); wolffd@0: irs = mxGetIr(plhs[0]); wolffd@0: jcs = mxGetJc(plhs[0]); wolffd@0: wolffd@0: /* Copy nonzeros. */ wolffd@0: k = 0; wolffd@0: isfull = 0; wolffd@0: for (j = 0; (j < n); j++) { wolffd@0: int i; wolffd@0: jcs[j] = k; wolffd@0: for (i = 0; (i < m); i++) { wolffd@0: if (IsNonZero(pr[i]) || (cmplx && IsNonZero(pi[i]))) { 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 10%, 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.1; 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: wolffd@0: mxSetNzmax(plhs[0], nzmax); wolffd@0: mxSetPr(plhs[0], mxRealloc(sr, nzmax*sizeof(double))); wolffd@0: if (si != NULL) wolffd@0: mxSetPi(plhs[0], mxRealloc(si, nzmax*sizeof(double))); wolffd@0: mxSetIr(plhs[0], mxRealloc(irs, nzmax*sizeof(int))); wolffd@0: wolffd@0: sr = mxGetPr(plhs[0]); wolffd@0: si = mxGetPi(plhs[0]); wolffd@0: irs = mxGetIr(plhs[0]); wolffd@0: } wolffd@0: sr[k] = pr[i]; wolffd@0: if (cmplx) { wolffd@0: si[k] = pi[i]; wolffd@0: } wolffd@0: irs[k] = i; wolffd@0: k++; wolffd@0: } wolffd@0: } wolffd@0: pr += m; wolffd@0: pi += m; wolffd@0: } wolffd@0: jcs[n] = k; wolffd@0: }