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