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 }
|