ivan@140: /************************************************************************** ivan@140: * ivan@140: * File name: ompmex.c ivan@140: * ivan@140: * Ron Rubinstein ivan@140: * Computer Science Department ivan@140: * Technion, Haifa 32000 Israel ivan@140: * ronrubin@cs ivan@140: * ivan@140: * Last Updated: 18.8.2009 ivan@140: * ivan@140: *************************************************************************/ ivan@140: ivan@140: #include "ompcoreGabor.h" ivan@140: #include "omputils.h" ivan@140: #include "mexutils.h" ivan@140: ivan@140: ivan@140: /* Input Arguments */ ivan@140: ivan@140: #define IN_D prhs[0] ivan@140: #define IN_X prhs[1] ivan@140: #define IN_DtX prhs[2] ivan@140: #define IN_G prhs[3] ivan@140: #define IN_T prhs[4] ivan@140: #define IN_SPARSE_G prhs[5] ivan@140: #define IN_MSGDELTA prhs[6] ivan@140: #define IN_PROFILE prhs[7] ivan@140: ivan@140: ivan@140: /* Output Arguments */ ivan@140: ivan@140: #define GAMMA_OUT plhs[0] ivan@140: ivan@140: ivan@140: /***************************************************************************************/ ivan@140: ivan@140: ivan@140: void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray*prhs[]) ivan@140: ivan@140: { ivan@140: double *D, *x, *DtX, *G, msgdelta; ivan@140: int gmode, profile, T; ivan@140: mwSize m, n, L; /* D is n x m , X is n x L, DtX is m x L */ ivan@140: ivan@140: ivan@140: /* check parameters */ ivan@140: ivan@140: checkmatrix(IN_D, "OMP", "D"); ivan@140: checkmatrix(IN_X, "OMP", "X"); ivan@140: checkmatrix(IN_DtX, "OMP", "DtX"); ivan@140: checkmatrix(IN_G, "OMP", "G"); ivan@140: ivan@140: checkscalar(IN_T, "OMP", "T"); ivan@140: checkscalar(IN_SPARSE_G, "OMP", "sparse_g"); ivan@140: checkscalar(IN_MSGDELTA, "OMP", "msgdelta"); ivan@140: checkscalar(IN_PROFILE, "OMP", "profile"); ivan@140: ivan@140: ivan@140: /* get parameters */ ivan@140: ivan@140: x = D = DtX = G = 0; ivan@140: ivan@140: if (!mxIsEmpty(IN_D)) ivan@140: D = mxGetPr(IN_D); ivan@140: ivan@140: if (!mxIsEmpty(IN_X)) ivan@140: x = mxGetPr(IN_X); ivan@140: ivan@140: if (!mxIsEmpty(IN_DtX)) ivan@140: DtX = mxGetPr(IN_DtX); ivan@140: ivan@140: if (!mxIsEmpty(IN_G)) ivan@140: G = mxGetPr(IN_G); ivan@140: ivan@140: T = (int)(mxGetScalar(IN_T)+1e-2); ivan@140: if ((int)(mxGetScalar(IN_SPARSE_G)+1e-2)) { ivan@140: gmode = SPARSE_GAMMA; ivan@140: } ivan@140: else { ivan@140: gmode = FULL_GAMMA; ivan@140: } ivan@140: msgdelta = mxGetScalar(IN_MSGDELTA); ivan@140: profile = (int)(mxGetScalar(IN_PROFILE)+1e-2); ivan@140: ivan@140: ivan@140: /* check sizes */ ivan@140: ivan@140: if (D && x) { ivan@140: n = mxGetM(IN_D); ivan@140: m = mxGetN(IN_D); ivan@140: L = mxGetN(IN_X); ivan@140: ivan@140: if (mxGetM(IN_X) != n) { ivan@140: mexErrMsgTxt("D and X have incompatible sizes."); ivan@140: } ivan@140: ivan@140: if (G) { ivan@140: if (mxGetN(IN_G)!=mxGetM(IN_G)) { ivan@140: mexErrMsgTxt("G must be a square matrix."); ivan@140: } ivan@140: if (mxGetN(IN_G) != m) { ivan@140: mexErrMsgTxt("D and G have incompatible sizes."); ivan@140: } ivan@140: } ivan@140: } ivan@140: ivan@140: else if (DtX) { ivan@140: m = mxGetM(IN_DtX); ivan@140: L = mxGetN(IN_DtX); ivan@140: ivan@140: n = T; /* arbitrary - it is enough to assume signal length is T */ ivan@140: ivan@140: if (mxGetN(IN_G)!=mxGetM(IN_G)) { ivan@140: mexErrMsgTxt("G must be a square matrix."); ivan@140: } ivan@140: if (mxGetN(IN_G) != m) { ivan@140: mexErrMsgTxt("DtX and G have incompatible sizes."); ivan@140: } ivan@140: } ivan@140: ivan@140: else { ivan@140: mexErrMsgTxt("Either D and X, or DtX, must be specified."); ivan@140: } ivan@140: ivan@140: ivan@140: /* Do OMP! */ ivan@140: ivan@140: GAMMA_OUT = ompcoreGabor(D, x, DtX, 0, G, n, m, L, T, 0, gmode, profile, msgdelta, 0); ivan@140: ivan@140: return; ivan@140: } ivan@140: