int dartel_scratchsize(int dm[], int issym) { int m1, m2; int m = dm[0]*dm[1]; m1 = 15*m; if (issym) m1 += 5*m; m2 = 5*m+fmg2_scratchsize(dm); if (m1>m2) return(m1); else return(m2); }
void fmg2_mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { const int *dm; int cyc=1, nit=1, rtype=2; double *A, *b, *x, *scratch; static double param[] = {1.0, 1.0, 1.0, 0.0, 0.0}; if (nrhs!=3 || nlhs>1) mexErrMsgTxt("Incorrect usage"); if (!mxIsNumeric(prhs[0]) || mxIsComplex(prhs[0]) || mxIsSparse(prhs[0]) || !mxIsDouble(prhs[0])) mexErrMsgTxt("Data must be numeric, real, full and double"); if (mxGetNumberOfDimensions(prhs[0])!=3) mexErrMsgTxt("Wrong number of dimensions."); if (mxGetDimensions(prhs[0])[2]!=3) mexErrMsgTxt("3rd dimension of 1st arg must be 3."); if (!mxIsNumeric(prhs[1]) || mxIsComplex(prhs[1]) || mxIsSparse(prhs[1]) || !mxIsDouble(prhs[1])) mexErrMsgTxt("Data must be numeric, real, full and double"); if (mxGetNumberOfDimensions(prhs[1])!=3) mexErrMsgTxt("Wrong number of dimensions."); dm = mxGetDimensions(prhs[1]); if (dm[2]!=2) mexErrMsgTxt("3rd dimension of second arg must be 2."); if (mxGetDimensions(prhs[0])[0] != dm[0]) mexErrMsgTxt("Incompatible 1st dimension."); if (mxGetDimensions(prhs[0])[1] != dm[1]) mexErrMsgTxt("Incompatible 2nd dimension."); if (!mxIsNumeric(prhs[2]) || mxIsComplex(prhs[2]) || mxIsSparse(prhs[2]) || !mxIsDouble(prhs[2])) mexErrMsgTxt("Data must be numeric, real, full and double"); if (mxGetNumberOfElements(prhs[2]) >8) mexErrMsgTxt("Third argument should contain rtype, vox1, vox2, param1, param2, param3, ncycles and relax-its."); if (mxGetNumberOfElements(prhs[2]) >=1) rtype = (int)mxGetPr(prhs[2])[0]; if (mxGetNumberOfElements(prhs[2]) >=2) param[0] = 1/mxGetPr(prhs[2])[1]; if (mxGetNumberOfElements(prhs[2]) >=3) param[1] = 1/mxGetPr(prhs[2])[2]; if (mxGetNumberOfElements(prhs[2]) >=4) param[2] = mxGetPr(prhs[2])[3]; if (mxGetNumberOfElements(prhs[2]) >=5) param[3] = mxGetPr(prhs[2])[4]; if (mxGetNumberOfElements(prhs[2]) >=6) param[4] = mxGetPr(prhs[2])[5]; if (mxGetNumberOfElements(prhs[2]) >=7) cyc = mxGetPr(prhs[2])[6]; if (mxGetNumberOfElements(prhs[2]) >=8) nit = (int)mxGetPr(prhs[2])[7]; plhs[0] = mxCreateNumericArray(3,dm, mxDOUBLE_CLASS, mxREAL); A = mxGetPr(prhs[0]); b = mxGetPr(prhs[1]); x = mxGetPr(plhs[0]); scratch = (double *)mxCalloc(fmg2_scratchsize((int *)dm),sizeof(double)); fmg2((int *)dm, A, b, rtype, param, cyc, nit, x, scratch); mxFree((void *)scratch); }