annotate MAP/intpow.c @ 38:c2204b18f4a2 tip

End nov big change
author Ray Meddis <rmeddis@essex.ac.uk>
date Mon, 28 Nov 2011 13:34:28 +0000
parents f233164f4c86
children
rev   line source
rmeddis@0 1 /* intpow - Nick Clark - 3/5/2011
rmeddis@0 2 *
rmeddis@0 3 * Function that raises a double precision vector to an integer power
rmeddis@0 4 * vector. The following call to this mex function...
rmeddis@0 5 *
rmeddis@0 6 * >> z = intpow(x,y)
rmeddis@0 7 *
rmeddis@0 8 * ... does the equivalent of the following in Matlab...
rmeddis@0 9 *
rmeddis@0 10 * >> z = x .^ ceil(y)
rmeddis@0 11 *
rmeddis@0 12 * NOTE: Under most circumstances, this function is slower than MATLAB's
rmeddis@0 13 * built in ^ operator, but for the (generally) small integer powers used
rmeddis@0 14 * in MAP we observe massive performance boosts using this C function.
rmeddis@0 15 */
rmeddis@0 16
rmeddis@0 17 /*************************************************************************/
rmeddis@0 18 /* Header(s) */
rmeddis@0 19 /*************************************************************************/
rmeddis@0 20 #include "mex.h"
rmeddis@0 21
rmeddis@0 22 /*************************************************************************/
rmeddis@0 23 /* Input vars */
rmeddis@0 24 /*************************************************************************/
rmeddis@0 25 #define IN_x prhs[0]
rmeddis@0 26 #define IN_y prhs[1]
rmeddis@0 27
rmeddis@0 28 /*************************************************************************/
rmeddis@0 29 /* Output vars */
rmeddis@0 30 /*************************************************************************/
rmeddis@0 31 #define OUT_z plhs[0]
rmeddis@0 32
rmeddis@0 33 /*************************************************************************/
rmeddis@0 34 /* Gateway function and error checking */
rmeddis@0 35 /*************************************************************************/
rmeddis@0 36 void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
rmeddis@0 37 {
rmeddis@0 38 /* variable declarations */
rmeddis@0 39 int numElements, xM, xN, yM, yN;
rmeddis@0 40 int nn, kk;
rmeddis@0 41 double *x, *y, *z;
rmeddis@0 42
rmeddis@0 43 /* check the number of input and output parameters */
rmeddis@0 44 if(nrhs!=2)
rmeddis@0 45 mexErrMsgTxt("intpow : Two input args expected");
rmeddis@0 46 if(nlhs > 1)
rmeddis@0 47 mexErrMsgTxt("intpow : Too many outputs");
rmeddis@0 48
rmeddis@0 49 /* check that x and y have equal size */
rmeddis@0 50 x = mxGetPr(IN_x);
rmeddis@0 51 xM = mxGetM(IN_x);
rmeddis@0 52 xN = mxGetN(IN_x);
rmeddis@0 53
rmeddis@0 54 y = mxGetPr(IN_y);
rmeddis@0 55 yM = mxGetM(IN_y);
rmeddis@0 56 yN = mxGetN(IN_y);
rmeddis@0 57
rmeddis@0 58 if (xM != yM || xN != yN)
rmeddis@0 59 mexErrMsgTxt("intpow : x and y must have equal size");
rmeddis@0 60
rmeddis@0 61 /* find upper loop boundary */
rmeddis@0 62 numElements = xM * xN;
rmeddis@0 63
rmeddis@0 64 /* allocate memory and pointer for the output array */
rmeddis@0 65 OUT_z = mxCreateDoubleMatrix(xM,xN,mxREAL);
rmeddis@0 66 z = mxGetPr(OUT_z);
rmeddis@0 67
rmeddis@0 68 /* do stuff */
rmeddis@0 69 for( nn = 0; nn<numElements; ++nn )
rmeddis@0 70 {
rmeddis@0 71 z[nn] = 1.0;
rmeddis@0 72 for (kk = 0; kk<y[nn]; ++kk)
rmeddis@0 73 {
rmeddis@0 74 z[nn] = z[nn]*x[nn];
rmeddis@0 75 }
rmeddis@0 76 }
rmeddis@0 77 }