ivan@137: /************************************************************************** ivan@137: * ivan@137: * File name: omp2mex.c ivan@137: * ivan@137: * Ron Rubinstein ivan@137: * Computer Science Department ivan@137: * Technion, Haifa 32000 Israel ivan@137: * ronrubin@cs ivan@137: * ivan@137: * Last Updated: 18.8.2009 ivan@137: * ivan@137: *************************************************************************/ ivan@137: ivan@137: #include "ompcoreGabor.h" ivan@137: #include "omputils.h" ivan@137: #include "mexutils.h" ivan@137: ivan@137: ivan@137: /* Input Arguments */ ivan@137: ivan@137: #define IN_D prhs[0] ivan@137: #define IN_X prhs[1] ivan@137: #define IN_DtX prhs[2] ivan@137: #define IN_XtX prhs[3] ivan@137: #define IN_G prhs[4] ivan@137: #define IN_EPS prhs[5] ivan@137: #define IN_SPARSE_G prhs[6] ivan@137: #define IN_MSGDELTA prhs[7] ivan@137: #define IN_MAXATOMS prhs[8] ivan@137: #define IN_PROFILE prhs[9] ivan@137: ivan@137: ivan@137: /* Output Arguments */ ivan@137: ivan@137: #define GAMMA_OUT plhs[0] ivan@137: ivan@137: ivan@137: /***************************************************************************************/ ivan@137: ivan@137: ivan@137: void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray*prhs[]) ivan@137: ivan@137: { ivan@137: double *D, *x, *DtX, *XtX, *G, eps, msgdelta; ivan@137: int gmode, maxatoms, profile; ivan@137: mwSize m, n, L; /* D is n x m , X is n x L, DtX is m x L */ ivan@137: ivan@137: ivan@137: /* check parameters */ ivan@137: ivan@137: checkmatrix(IN_D, "OMP2", "D"); ivan@137: checkmatrix(IN_X, "OMP2", "X"); ivan@137: checkmatrix(IN_DtX, "OMP2", "DtX"); ivan@137: checkmatrix(IN_XtX, "OMP2", "XtX"); ivan@137: checkmatrix(IN_G, "OMP2", "G"); ivan@137: ivan@137: checkscalar(IN_EPS, "OMP2", "EPSILON"); ivan@137: checkscalar(IN_SPARSE_G, "OMP2", "sparse_g"); ivan@137: checkscalar(IN_MSGDELTA, "OMP2", "msgdelta"); ivan@137: checkscalar(IN_MAXATOMS, "OMP2", "maxatoms"); ivan@137: checkscalar(IN_PROFILE, "OMP2", "profile"); ivan@137: ivan@137: ivan@137: /* get parameters */ ivan@137: ivan@137: x = D = DtX = XtX = G = 0; ivan@137: ivan@137: if (!mxIsEmpty(IN_D)) ivan@137: D = mxGetPr(IN_D); ivan@137: ivan@137: if (!mxIsEmpty(IN_X)) ivan@137: x = mxGetPr(IN_X); ivan@137: ivan@137: if (!mxIsEmpty(IN_DtX)) ivan@137: DtX = mxGetPr(IN_DtX); ivan@137: ivan@137: if (!mxIsEmpty(IN_XtX)) ivan@137: XtX = mxGetPr(IN_XtX); ivan@137: ivan@137: if (!mxIsEmpty(IN_G)) ivan@137: G = mxGetPr(IN_G); ivan@137: ivan@137: eps = mxGetScalar(IN_EPS); ivan@137: if ((int)(mxGetScalar(IN_SPARSE_G)+1e-2)) { ivan@137: gmode = SPARSE_GAMMA; ivan@137: } ivan@137: else { ivan@137: gmode = FULL_GAMMA; ivan@137: } ivan@137: msgdelta = mxGetScalar(IN_MSGDELTA); ivan@137: if (mxGetScalar(IN_MAXATOMS) < -1e-5) { ivan@137: maxatoms = -1; ivan@137: } ivan@137: else { ivan@137: maxatoms = (int)(mxGetScalar(IN_MAXATOMS)+1e-2); ivan@137: } ivan@137: profile = (int)(mxGetScalar(IN_PROFILE)+1e-2); ivan@137: ivan@137: ivan@137: /* check sizes */ ivan@137: ivan@137: if (D && x) { ivan@137: n = mxGetM(IN_D); ivan@137: m = mxGetN(IN_D); ivan@137: L = mxGetN(IN_X); ivan@137: ivan@137: if (mxGetM(IN_X) != n) { ivan@137: mexErrMsgTxt("D and X have incompatible sizes."); ivan@137: } ivan@137: ivan@137: if (G) { ivan@137: if (mxGetN(IN_G)!=mxGetM(IN_G)) { ivan@137: mexErrMsgTxt("G must be a square matrix."); ivan@137: } ivan@137: if (mxGetN(IN_G) != m) { ivan@137: mexErrMsgTxt("D and G have incompatible sizes."); ivan@137: } ivan@137: } ivan@137: } ivan@137: ivan@137: else if (DtX && XtX) { ivan@137: m = mxGetM(IN_DtX); ivan@137: L = mxGetN(IN_DtX); ivan@137: ivan@137: /* set n to an arbitrary value that is at least the max possible number of selected atoms */ ivan@137: ivan@137: if (maxatoms>0) { ivan@137: n = maxatoms; ivan@137: } ivan@137: else { ivan@137: n = m; ivan@137: } ivan@137: ivan@137: if ( !(mxGetM(IN_XtX)==L && mxGetN(IN_XtX)==1) && !(mxGetM(IN_XtX)==1 && mxGetN(IN_XtX)==L) ) { ivan@137: mexErrMsgTxt("DtX and XtX have incompatible sizes."); ivan@137: } ivan@137: ivan@137: if (mxGetN(IN_G)!=mxGetM(IN_G)) { ivan@137: mexErrMsgTxt("G must be a square matrix."); ivan@137: } ivan@137: if (mxGetN(IN_G) != m) { ivan@137: mexErrMsgTxt("DtX and G have incompatible sizes."); ivan@137: } ivan@137: } ivan@137: ivan@137: else { ivan@137: mexErrMsgTxt("Either D and X, or DtX and XtX, must be specified."); ivan@137: } ivan@137: ivan@137: ivan@137: /* Do OMP! */ ivan@137: ivan@137: GAMMA_OUT = ompcoreGabor(D, x, DtX, XtX, G, n, m, L, maxatoms, eps, gmode, profile, msgdelta, 1); ivan@137: ivan@137: return; ivan@137: }