コード例 #1
0
ファイル: diffeo2d.c プロジェクト: Aewil-zz/MATLAB
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);
}
コード例 #2
0
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);
}