annotate DL/RLS-DLA/private/col2imstep.c @ 60:ad36f80e2ccf

(none)
author idamnjanovic
date Tue, 15 Mar 2011 12:20:59 +0000
parents
children
rev   line source
idamnjanovic@60 1 /**************************************************************************
idamnjanovic@60 2 *
idamnjanovic@60 3 * File name: col2imstep.c
idamnjanovic@60 4 *
idamnjanovic@60 5 * Ron Rubinstein
idamnjanovic@60 6 * Computer Science Department
idamnjanovic@60 7 * Technion, Haifa 32000 Israel
idamnjanovic@60 8 * ronrubin@cs
idamnjanovic@60 9 *
idamnjanovic@60 10 * Last Updated: 31.8.2009
idamnjanovic@60 11 *
idamnjanovic@60 12 *************************************************************************/
idamnjanovic@60 13
idamnjanovic@60 14
idamnjanovic@60 15 #include "mex.h"
idamnjanovic@60 16
idamnjanovic@60 17
idamnjanovic@60 18 /* Input Arguments */
idamnjanovic@60 19
idamnjanovic@60 20 #define B_IN prhs[0]
idamnjanovic@60 21 #define N_IN prhs[1]
idamnjanovic@60 22 #define SZ_IN prhs[2]
idamnjanovic@60 23 #define S_IN prhs[3]
idamnjanovic@60 24
idamnjanovic@60 25
idamnjanovic@60 26 /* Output Arguments */
idamnjanovic@60 27
idamnjanovic@60 28 #define X_OUT plhs[0]
idamnjanovic@60 29
idamnjanovic@60 30
idamnjanovic@60 31 void mexFunction(int nlhs, mxArray *plhs[],
idamnjanovic@60 32 int nrhs, const mxArray*prhs[])
idamnjanovic@60 33
idamnjanovic@60 34 {
idamnjanovic@60 35 double *x, *b, *s;
idamnjanovic@60 36 mwSize sz[3], stepsize[3], n[3], ndims;
idamnjanovic@60 37 mwIndex i, j, k, l, m, t, blocknum;
idamnjanovic@60 38
idamnjanovic@60 39
idamnjanovic@60 40 /* Check for proper number of arguments */
idamnjanovic@60 41
idamnjanovic@60 42 if (nrhs < 3 || nrhs > 4) {
idamnjanovic@60 43 mexErrMsgTxt("Invalid number of input arguments.");
idamnjanovic@60 44 } else if (nlhs > 1) {
idamnjanovic@60 45 mexErrMsgTxt("Too many output arguments.");
idamnjanovic@60 46 }
idamnjanovic@60 47
idamnjanovic@60 48
idamnjanovic@60 49 /* Check the the input dimensions */
idamnjanovic@60 50
idamnjanovic@60 51 if (!mxIsDouble(B_IN) || mxIsComplex(B_IN) || mxGetNumberOfDimensions(B_IN)>2) {
idamnjanovic@60 52 mexErrMsgTxt("B should be a double matrix.");
idamnjanovic@60 53 }
idamnjanovic@60 54 if (!mxIsDouble(N_IN) || mxIsComplex(N_IN) || mxGetNumberOfDimensions(N_IN)>2) {
idamnjanovic@60 55 mexErrMsgTxt("Invalid output matrix size.");
idamnjanovic@60 56 }
idamnjanovic@60 57 ndims = mxGetM(N_IN)*mxGetN(N_IN);
idamnjanovic@60 58 if (ndims<2 || ndims>3) {
idamnjanovic@60 59 mexErrMsgTxt("Output matrix can only be 2-D or 3-D.");
idamnjanovic@60 60 }
idamnjanovic@60 61 if (!mxIsDouble(SZ_IN) || mxIsComplex(SZ_IN) || mxGetNumberOfDimensions(SZ_IN)>2 || mxGetM(SZ_IN)*mxGetN(SZ_IN)!=ndims) {
idamnjanovic@60 62 mexErrMsgTxt("Invalid block size.");
idamnjanovic@60 63 }
idamnjanovic@60 64 if (nrhs == 4) {
idamnjanovic@60 65 if (!mxIsDouble(S_IN) || mxIsComplex(S_IN) || mxGetNumberOfDimensions(S_IN)>2 || mxGetM(S_IN)*mxGetN(S_IN)!=ndims) {
idamnjanovic@60 66 mexErrMsgTxt("Invalid step size.");
idamnjanovic@60 67 }
idamnjanovic@60 68 }
idamnjanovic@60 69
idamnjanovic@60 70
idamnjanovic@60 71 /* Get parameters */
idamnjanovic@60 72
idamnjanovic@60 73 s = mxGetPr(N_IN);
idamnjanovic@60 74 if (s[0]<1 || s[1]<1 || (ndims==3 && s[2]<1)) {
idamnjanovic@60 75 mexErrMsgTxt("Invalid output matrix size.");
idamnjanovic@60 76 }
idamnjanovic@60 77 n[0] = (mwSize)(s[0] + 0.01);
idamnjanovic@60 78 n[1] = (mwSize)(s[1] + 0.01);
idamnjanovic@60 79 n[2] = ndims==3 ? (mwSize)(s[2] + 0.01) : 1;
idamnjanovic@60 80
idamnjanovic@60 81 s = mxGetPr(SZ_IN);
idamnjanovic@60 82 if (s[0]<1 || s[1]<1 || (ndims==3 && s[2]<1)) {
idamnjanovic@60 83 mexErrMsgTxt("Invalid block size.");
idamnjanovic@60 84 }
idamnjanovic@60 85 sz[0] = (mwSize)(s[0] + 0.01);
idamnjanovic@60 86 sz[1] = (mwSize)(s[1] + 0.01);
idamnjanovic@60 87 sz[2] = ndims==3 ? (mwSize)(s[2] + 0.01) : 1;
idamnjanovic@60 88
idamnjanovic@60 89 if (nrhs == 4) {
idamnjanovic@60 90 s = mxGetPr(S_IN);
idamnjanovic@60 91 if (s[0]<1 || s[1]<1 || (ndims==3 && s[2]<1)) {
idamnjanovic@60 92 mexErrMsgTxt("Invalid step size.");
idamnjanovic@60 93 }
idamnjanovic@60 94 stepsize[0] = (mwSize)(s[0] + 0.01);
idamnjanovic@60 95 stepsize[1] = (mwSize)(s[1] + 0.01);
idamnjanovic@60 96 stepsize[2] = ndims==3 ? (mwSize)(s[2] + 0.01) : 1;
idamnjanovic@60 97 }
idamnjanovic@60 98 else {
idamnjanovic@60 99 stepsize[0] = stepsize[1] = stepsize[2] = 1;
idamnjanovic@60 100 }
idamnjanovic@60 101
idamnjanovic@60 102 if (n[0]<sz[0] || n[1]<sz[1] || (ndims==3 && n[2]<sz[2])) {
idamnjanovic@60 103 mexErrMsgTxt("Block size too large.");
idamnjanovic@60 104 }
idamnjanovic@60 105
idamnjanovic@60 106 if (mxGetN(B_IN) != ((n[0]-sz[0])/stepsize[0]+1)*((n[1]-sz[1])/stepsize[1]+1)*((n[2]-sz[2])/stepsize[2]+1)) {
idamnjanovic@60 107 mexErrMsgTxt("Invalid number of columns in B. Please use IM2COLSTEP to compute B.");
idamnjanovic@60 108 }
idamnjanovic@60 109
idamnjanovic@60 110
idamnjanovic@60 111 /* Create a matrix for the return argument */
idamnjanovic@60 112
idamnjanovic@60 113 X_OUT = mxCreateNumericArray(ndims, n, mxDOUBLE_CLASS, mxREAL);
idamnjanovic@60 114
idamnjanovic@60 115
idamnjanovic@60 116 /* Assign pointers */
idamnjanovic@60 117
idamnjanovic@60 118 b = mxGetPr(B_IN);
idamnjanovic@60 119 x = mxGetPr(X_OUT);
idamnjanovic@60 120
idamnjanovic@60 121
idamnjanovic@60 122 /* Do the actual computation */
idamnjanovic@60 123
idamnjanovic@60 124 blocknum = 0;
idamnjanovic@60 125
idamnjanovic@60 126 /* iterate over all blocks */
idamnjanovic@60 127 for (k=0; k<=n[2]-sz[2]; k+=stepsize[2]) {
idamnjanovic@60 128 for (j=0; j<=n[1]-sz[1]; j+=stepsize[1]) {
idamnjanovic@60 129 for (i=0; i<=n[0]-sz[0]; i+=stepsize[0]) {
idamnjanovic@60 130
idamnjanovic@60 131 /* add single block */
idamnjanovic@60 132 for (m=0; m<sz[2]; m++) {
idamnjanovic@60 133 for (l=0; l<sz[1]; l++) {
idamnjanovic@60 134 for (t=0; t<sz[0]; t++) {
idamnjanovic@60 135 (x+(k+m)*n[0]*n[1]+(j+l)*n[0]+i)[t] += (b + blocknum*sz[0]*sz[1]*sz[2] + m*sz[0]*sz[1] + l*sz[0])[t];
idamnjanovic@60 136 }
idamnjanovic@60 137 }
idamnjanovic@60 138 }
idamnjanovic@60 139 blocknum++;
idamnjanovic@60 140
idamnjanovic@60 141 }
idamnjanovic@60 142 }
idamnjanovic@60 143 }
idamnjanovic@60 144
idamnjanovic@60 145 return;
idamnjanovic@60 146 }