#include "mex.h" #include #include #include #include #define index(A,B,C,DIM) ((C)*DIM[0]*DIM[1] + (B)*DIM[0] + (A)) #ifndef MIN #define MIN(A,B) ((A) > (B) ? (B) : (A)) #endif #ifndef MAX #define MAX(A,B) ((A) > (B) ? (A) : (B)) #endif unsigned int make_vectors(double *rima, double *pm, mwSize dim[3], double **ii, double **jj, double **nn, double **pp) { int cri = 0, nxti = 0; int sl=0, r=0, c=0; double cr = 0.0, nxt = 0.0; unsigned int i = 0; size_t size = 10000; (*ii) = mxCalloc(size,sizeof(double)); (*jj) = mxCalloc(size,sizeof(double)); (*nn) = mxCalloc(size,sizeof(double)); (*pp) = mxCalloc(size,sizeof(double)); for (sl=0; sl (size-4)) { size += 10000; (*ii) = mxRealloc((*ii),size*sizeof(double)); (*jj) = mxRealloc((*jj),size*sizeof(double)); (*nn) = mxRealloc((*nn),size*sizeof(double)); (*pp) = mxRealloc((*pp),size*sizeof(double)); } if (sl) { if ((nxt = rima[nxti = index(r,c,sl-1,dim)]) && (cr != nxt)) { (*ii)[i] = MIN(cr,nxt); (*jj)[i] = MAX(cr,nxt); (*nn)[i] = 1.0; if (cr < nxt) (*pp)[i] = pm[cri] - pm[nxti]; else (*pp)[i] = pm[nxti] - pm[cri]; i++; } } if (c) { if ((nxt = rima[nxti = index(r,c-1,sl,dim)]) && (cr != nxt)) { (*ii)[i] = MIN(cr,nxt); (*jj)[i] = MAX(cr,nxt); (*nn)[i] = 1.0; if (cr < nxt) (*pp)[i] = pm[cri] - pm[nxti]; else (*pp)[i] = pm[nxti] - pm[cri]; i++; } } if (r) { if ((nxt = rima[nxti = index(r-1,c,sl,dim)]) && (cr != nxt)) { (*ii)[i] = MIN(cr,nxt); (*jj)[i] = MAX(cr,nxt); (*nn)[i] = 1.0; if (cr < nxt) (*pp)[i] = pm[cri] - pm[nxti]; else (*pp)[i] = pm[nxti] - pm[cri]; i++; } } } } } } return(i); } /* Gateway function with error check. */ void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { mwSize ndim, pm_ndim; int n, i; const mwSize *cdim = NULL, *pm_cdim = NULL; mwSize dim[3]; mwSize nnz = 0; double *rima = NULL; double *pm = NULL; double *ii = NULL, *jj = NULL; double *nn = NULL, *pp = NULL; double *tmp = NULL; if (nrhs == 0) mexErrMsgTxt("usage: [i,j,n,p]=pm_create_connectogram_dtj(rima,pm)"); if (nrhs != 2) mexErrMsgTxt("pm_create_connectogram_dtj: 2 input arguments required"); if (nlhs != 4) mexErrMsgTxt("pm_create_connectogram_dtj: 4 output argument required"); /* Get connected components map. */ if (!mxIsNumeric(prhs[0]) || mxIsComplex(prhs[0]) || mxIsSparse(prhs[0]) || !mxIsDouble(prhs[0])) { mexErrMsgTxt("pm_bwlabel_dtj: rima must be numeric, real, full and double"); } ndim = mxGetNumberOfDimensions(prhs[0]); if ((ndim < 2) | (ndim > 3)) { mexErrMsgTxt("pm_bwlabel_dtj: rima must be 2 or 3-dimensional"); } cdim = mxGetDimensions(prhs[0]); rima = mxGetPr(prhs[0]); /* Get phase-map. */ if (!mxIsNumeric(prhs[1]) || mxIsComplex(prhs[1]) || mxIsSparse(prhs[1]) || !mxIsDouble(prhs[1])) { mexErrMsgTxt("pm_bwlabel_dtj: pm must be numeric, real, full and double"); } pm_ndim = mxGetNumberOfDimensions(prhs[1]); if (pm_ndim != ndim) { mexErrMsgTxt("pm_bwlabel_dtj: rima and pm must have same dimensionality"); } pm_cdim = mxGetDimensions(prhs[1]); for (i=0; i