idamnjanovic@60: /************************************************************************** idamnjanovic@60: * idamnjanovic@60: * File name: im2colstep.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: 31.8.2009 idamnjanovic@60: * idamnjanovic@60: *************************************************************************/ idamnjanovic@60: idamnjanovic@60: idamnjanovic@60: #include "mex.h" idamnjanovic@60: #include idamnjanovic@60: idamnjanovic@60: idamnjanovic@60: /* Input Arguments */ idamnjanovic@60: idamnjanovic@60: #define X_IN prhs[0] idamnjanovic@60: #define SZ_IN prhs[1] idamnjanovic@60: #define S_IN prhs[2] idamnjanovic@60: idamnjanovic@60: idamnjanovic@60: /* Output Arguments */ idamnjanovic@60: idamnjanovic@60: #define B_OUT plhs[0] idamnjanovic@60: idamnjanovic@60: idamnjanovic@60: void mexFunction(int nlhs, mxArray *plhs[], idamnjanovic@60: int nrhs, const mxArray*prhs[]) idamnjanovic@60: idamnjanovic@60: { idamnjanovic@60: double *x, *b, *s; idamnjanovic@60: mwSize sz[3], stepsize[3], n[3], ndims; idamnjanovic@60: mwIndex i, j, k, l, m, blocknum; idamnjanovic@60: idamnjanovic@60: idamnjanovic@60: /* Check for proper number of arguments */ idamnjanovic@60: idamnjanovic@60: if (nrhs < 2 || nrhs > 3) { idamnjanovic@60: mexErrMsgTxt("Invalid number of input arguments."); idamnjanovic@60: } else if (nlhs > 1) { idamnjanovic@60: mexErrMsgTxt("Too many output arguments."); idamnjanovic@60: } idamnjanovic@60: idamnjanovic@60: idamnjanovic@60: /* Check the the input dimensions */ idamnjanovic@60: idamnjanovic@60: ndims = mxGetNumberOfDimensions(X_IN); idamnjanovic@60: idamnjanovic@60: if (!mxIsDouble(X_IN) || mxIsComplex(X_IN) || ndims>3) { idamnjanovic@60: mexErrMsgTxt("X should be a 2-D or 3-D double matrix."); idamnjanovic@60: } idamnjanovic@60: if (!mxIsDouble(SZ_IN) || mxIsComplex(SZ_IN) || mxGetNumberOfDimensions(SZ_IN)>2 || mxGetM(SZ_IN)*mxGetN(SZ_IN)!=ndims) { idamnjanovic@60: mexErrMsgTxt("Invalid block size."); idamnjanovic@60: } idamnjanovic@60: if (nrhs == 3) { idamnjanovic@60: if (!mxIsDouble(S_IN) || mxIsComplex(S_IN) || mxGetNumberOfDimensions(S_IN)>2 || mxGetM(S_IN)*mxGetN(S_IN)!=ndims) { idamnjanovic@60: mexErrMsgTxt("Invalid step size."); idamnjanovic@60: } idamnjanovic@60: } idamnjanovic@60: idamnjanovic@60: idamnjanovic@60: /* Get parameters */ idamnjanovic@60: idamnjanovic@60: s = mxGetPr(SZ_IN); idamnjanovic@60: if (s[0]<1 || s[1]<1 || (ndims==3 && s[2]<1)) { idamnjanovic@60: mexErrMsgTxt("Invalid block size."); idamnjanovic@60: } idamnjanovic@60: sz[0] = (mwSize)(s[0] + 0.01); idamnjanovic@60: sz[1] = (mwSize)(s[1] + 0.01); idamnjanovic@60: sz[2] = ndims==3 ? (mwSize)(s[2] + 0.01) : 1; idamnjanovic@60: idamnjanovic@60: if (nrhs == 3) { idamnjanovic@60: s = mxGetPr(S_IN); idamnjanovic@60: if (s[0]<1 || s[1]<1 || (ndims==3 && s[2]<1)) { idamnjanovic@60: mexErrMsgTxt("Invalid step size."); idamnjanovic@60: } idamnjanovic@60: stepsize[0] = (mwSize)(s[0] + 0.01); idamnjanovic@60: stepsize[1] = (mwSize)(s[1] + 0.01); idamnjanovic@60: stepsize[2] = ndims==3 ? (mwSize)(s[2] + 0.01) : 1; idamnjanovic@60: } idamnjanovic@60: else { idamnjanovic@60: stepsize[0] = stepsize[1] = stepsize[2] = 1; idamnjanovic@60: } idamnjanovic@60: idamnjanovic@60: n[0] = (mxGetDimensions(X_IN))[0]; idamnjanovic@60: n[1] = (mxGetDimensions(X_IN))[1]; idamnjanovic@60: n[2] = ndims==3 ? (mxGetDimensions(X_IN))[2] : 1; idamnjanovic@60: idamnjanovic@60: if (n[0]