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