Mercurial > hg > map
diff MAP/intpow.c @ 0:f233164f4c86
first commit
author | Ray Meddis <rmeddis@essex.ac.uk> |
---|---|
date | Fri, 27 May 2011 13:19:21 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MAP/intpow.c Fri May 27 13:19:21 2011 +0100 @@ -0,0 +1,77 @@ +/* intpow - Nick Clark - 3/5/2011 + * + * Function that raises a double precision vector to an integer power + * vector. The following call to this mex function... + * + * >> z = intpow(x,y) + * + * ... does the equivalent of the following in Matlab... + * + * >> z = x .^ ceil(y) + * + * NOTE: Under most circumstances, this function is slower than MATLAB's + * built in ^ operator, but for the (generally) small integer powers used + * in MAP we observe massive performance boosts using this C function. + */ + +/*************************************************************************/ +/* Header(s) */ +/*************************************************************************/ +#include "mex.h" + +/*************************************************************************/ +/* Input vars */ +/*************************************************************************/ +#define IN_x prhs[0] +#define IN_y prhs[1] + +/*************************************************************************/ +/* Output vars */ +/*************************************************************************/ +#define OUT_z plhs[0] + +/*************************************************************************/ +/* Gateway function and error checking */ +/*************************************************************************/ +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) +{ + /* variable declarations */ + int numElements, xM, xN, yM, yN; + int nn, kk; + double *x, *y, *z; + + /* check the number of input and output parameters */ + if(nrhs!=2) + mexErrMsgTxt("intpow : Two input args expected"); + if(nlhs > 1) + mexErrMsgTxt("intpow : Too many outputs"); + + /* check that x and y have equal size */ + x = mxGetPr(IN_x); + xM = mxGetM(IN_x); + xN = mxGetN(IN_x); + + y = mxGetPr(IN_y); + yM = mxGetM(IN_y); + yN = mxGetN(IN_y); + + if (xM != yM || xN != yN) + mexErrMsgTxt("intpow : x and y must have equal size"); + + /* find upper loop boundary */ + numElements = xM * xN; + + /* allocate memory and pointer for the output array */ + OUT_z = mxCreateDoubleMatrix(xM,xN,mxREAL); + z = mxGetPr(OUT_z); + + /* do stuff */ + for( nn = 0; nn<numElements; ++nn ) + { + z[nn] = 1.0; + for (kk = 0; kk<y[nn]; ++kk) + { + z[nn] = z[nn]*x[nn]; + } + } +}