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