/* * interp1_table_per_mex() */ static int interp1_table_per_mex( mxArray *plhs[], const mxArray *mx_ck, const mxArray *mx_h1, const mxArray *mx_J, const mxArray *mx_L, const mxArray *mx_tm, const mxArray *mx_order, /* optional: may be NULL */ const mxArray *mx_flips) /* optional: may be NULL */ { const int K1 = mxGetM(mx_ck); /* # of DFT coefficients */ const int N = mxGetN(mx_ck); /* # of realizations */ const int M = mxGetM(mx_tm); /* # of time samples */ const int J1 = *((int *) mxGetData(mx_J)); const int L1 = *((int *) mxGetData(mx_L)); const double *r_h1 = mxGetPr(mx_h1); const double *p_tm = mxGetPr(mx_tm); const double *r_ck = mxGetPr(mx_ck); const double *i_ck = mxGetPi(mx_ck); const int order = mx_order ? *((int *) mxGetData(mx_order)) : 0; const int flip1 = mx_flips ? *((int *) mxGetData(mx_flips)) : 0; double *r_fm, *i_fm; int nn; if (N != 1) fprintf(stderr, "Caution: multiple columns?"); Call(mxIsComplexDouble, (mx_ck)) Call(mxIsRealDouble, (mx_tm)) /* J, L, must be scalar */ if (!mxIsScalarInt32(mx_J)) Fail("J must be scalar int32") if (!mxIsScalarInt32(mx_L)) Fail("L must be scalar int32") if (mx_order && !mxIsScalarInt32(mx_order)) Fail("order must be scalar int32 (0 | 1)") if (mx_flips && !mxIsScalarInt32(mx_flips)) Fail("flips must be scalar int32 (0 | 1)") /* check h table size */ if ((int) mxGetM(mx_h1) != J1*L1+1 || (mxGetN(mx_h1) != 1)) { fprintf(stderr, "J=%d L=%d tablelength=%d\n", J1, L1, (int) mxGetM(mx_h1)); Fail("h size problem") }
/* * Usage: ck = function(fm, h_table, J, L, tm, K) */ static int interp1_table_adj_mex( mxArray *plhs[], const mxArray *mx_fm, const mxArray *mx_h1, const mxArray *mx_J, const mxArray *mx_L, const mxArray *mx_tm, const mxArray *mx_K) { const int M = mxGetM(mx_fm); /* # of time samples */ const int N = mxGetN(mx_fm); /* # of realizations */ const int J = *((int *) mxGetData(mx_J)); const int K = *((int *) mxGetData(mx_K)); const int L = *((int *) mxGetData(mx_L)); const double *r_fm = mxGetPr(mx_fm); const double *i_fm = mxGetPi(mx_fm); const double *p_tm = mxGetPr(mx_tm); const double *r_h1 = mxGetPr(mx_h1); double *r_ck, *i_ck; int nn; if (N != 1) fprintf(stderr, "Caution: multiple columns?"); Call(mxIsComplexDouble, (mx_fm)) Call(mxIsRealDouble, (mx_tm)) /* J, L, K must be scalar */ if (!mxIsScalarInt32(mx_J)) Fail("J must be scalar int32") if (!mxIsScalarInt32(mx_K)) Fail("K must be scalar int32") if (!mxIsScalarInt32(mx_L)) Fail("L must be scalar int32") /* check h table size */ if ((int) mxGetM(mx_h1) != J*L+1) { fprintf(stderr, "J=%d L=%d tablelength=%d\n", J, L, (int) mxGetM(mx_h1)); Fail("h size problem") }
/* * interp3_table_mex() */ static int interp3_table_mex( mxArray *plhs[], const mxArray *mx_ck, /* [K1,K2,K3] DFT coefficients */ const mxArray *mx_h1, const mxArray *mx_h2, const mxArray *mx_h3, const mxArray *mx_J, const mxArray *mx_L, const mxArray *mx_tm, const mxArray *mx_order, /* optional: may be NULL */ const mxArray *mx_flips) /* optional: may be NULL */ { int nn; const int ndim = mxGetNumberOfDimensions(mx_ck); const int K1 = (ndim > 0) ? (mxGetDimensions(mx_ck))[0] : 1; const int K2 = (ndim > 1) ? (mxGetDimensions(mx_ck))[1] : 1; const int K3 = (ndim > 2) ? (mxGetDimensions(mx_ck))[2] : 1; const int N = (ndim > 3) ? (mxGetDimensions(mx_ck))[3] : 1; const int M = mxGetM(mx_tm); /* # of time samples */ const int *Jd = (int *) mxGetData(mx_J); const int *Ld = (int *) mxGetData(mx_L); const double *p_tm = mxGetPr(mx_tm); const double *r_h1 = mxGetPr(mx_h1); const double *r_h2 = mxGetPr(mx_h2); const double *r_h3 = mxGetPr(mx_h3); const double *r_ck = mxGetPr(mx_ck); const double *i_ck = mxGetPi(mx_ck); const int order = mx_order ? *((int *) mxGetData(mx_order)) : 0; const int *flips = mx_flips ? ((int *) mxGetData(mx_flips)) : NULL; double *r_fm, *i_fm; Call(mxIsComplexDouble, (mx_ck)) Call(mxIsRealDouble, (mx_tm)) /* J,L must be [1,3] */ if (!mxIsInt32n(mx_J, 3)) Fail("J must be [1,3]") if (!mxIsInt32n(mx_L, 3)) Fail("L must be [1,3]") if (mx_order && !mxIsScalarInt32(mx_order)) Fail("order must be scalar int32 (0 | 1)") if (mx_flips && !mxIsInt32n(mx_flips, 3)) Fail("flips must be [1 3] int32 (0 | 1)") /* check size & type of tables */ if ((int) mxGetM(mx_h1) != Jd[0]*Ld[0]+1 || mxGetN(mx_h1) != 1) { fprintf(stderr, "J=%d L=%d tablelength=%d\n", Jd[0], Ld[0], (int) mxGetM(mx_h1)); Fail("h1 size problem") }
/* * interp1_table_per_mex() */ static int interp1_table_per_mex( mxArray *plhs[], const mxArray *mx_ck, const mxArray *mx_h1, const mxArray *mx_J, const mxArray *mx_L, const mxArray *mx_tm) { const int K = mxGetM(mx_ck); /* # of DFT coefficients */ const int N = mxGetN(mx_ck); /* # of realizations */ const int M = mxGetM(mx_tm); /* # of time samples */ const int J1 = *((int *) mxGetData(mx_J)); const int L1 = *((int *) mxGetData(mx_L)); const double *r_h1 = mxGetPr(mx_h1); const double *i_h1 = mxGetPi(mx_h1); const double *p_tm = mxGetPr(mx_tm); const double *r_ck = mxGetPr(mx_ck); const double *i_ck = mxGetPi(mx_ck); double *r_fm, *i_fm; int nn; if (N != 1) fprintf(stderr, "Caution: multiple columns?"); /* J, L, must be scalar */ if (!mxIsScalarInt32(mx_J)) mexErrMsgTxt("J must be scalar int32"); if (!mxIsScalarInt32(mx_L)) mexErrMsgTxt("L must be scalar int32"); /* check h table size */ if (mxGetM(mx_h1) != J1*L1+1 || (mxGetN(mx_h1) != 1)) { fprintf(stderr, "J=%d L=%d tablelength=%d\n", J1, L1, mxGetM(mx_h1)); mexErrMsgTxt("h size problem"); } if (!mxIsComplex(mx_h1)) mexErrMsgTxt("h must be complex."); if (!mxIsComplex(mx_ck)) mexErrMsgTxt("ck must be complex."); if (mxGetN(mx_tm) != 1) mexErrMsgTxt("t_m must be col vector."); if (mxIsComplex(mx_tm)) mexErrMsgTxt("tm must be real"); /* create a new array and set the output pointer to it */ plhs[0] = mxCreateDoubleMatrix(M, N, mxCOMPLEX); r_fm = mxGetPr(plhs[0]); i_fm = mxGetPi(plhs[0]); /* call the C subroutine N times; once for each realization */ for (nn=0; nn < N; ++nn) { interp1_table_per(r_ck, i_ck, K, r_h1, i_h1, J1, L1, p_tm, M, r_fm, i_fm); r_ck += K; i_ck += K; r_fm += M; i_fm += M; } return 1; }