dawn@0
|
1 /*
|
dawn@0
|
2 * cumnorm_inplace.c
|
dawn@0
|
3 * cumulative mean-normalization of diff function
|
dawn@0
|
4 *
|
dawn@0
|
5 * Alain de Cheveigné, CNRS/Ircam Dec 2001
|
dawn@0
|
6 * (c) 2001 CNRS
|
dawn@0
|
7 */
|
dawn@0
|
8
|
dawn@0
|
9 #include <math.h>
|
dawn@0
|
10 #include "mex.h"
|
dawn@0
|
11
|
dawn@0
|
12 /* #define MWRAP */
|
dawn@0
|
13 #include "mwrap_check.h"
|
dawn@0
|
14
|
dawn@0
|
15 /* Input Arguments */
|
dawn@0
|
16 #define X_IN prhs[0]
|
dawn@0
|
17
|
dawn@0
|
18 /* Output Arguments */
|
dawn@0
|
19
|
dawn@0
|
20 static void cumsum_inplace(
|
dawn@0
|
21 double *xp, /* matrix to cumulative-mean-normalize (along columns) */
|
dawn@0
|
22 int m, /* rows */
|
dawn@0
|
23 int n /* columns */
|
dawn@0
|
24 )
|
dawn@0
|
25 {
|
dawn@0
|
26 int j,k;
|
dawn@0
|
27 double z, sum, mean;
|
dawn@0
|
28
|
dawn@0
|
29
|
dawn@0
|
30 for (k=0; k<n; k++) { /* for each column */
|
dawn@0
|
31 SET(xp[k*m+0])=1;
|
dawn@0
|
32 sum = 0.0;
|
dawn@0
|
33 for (j=1;j<m;j++) { /* for each row */
|
dawn@0
|
34 z = GET(xp[k*m+j]);
|
dawn@0
|
35 z = (z > 0) ? z:0; /* clip to remove numerical artifacts */
|
dawn@0
|
36 sum += z;
|
dawn@0
|
37 z = (sum>0) ? (z / (sum/j)) : 1; /* cumulative-mean-normalize */
|
dawn@0
|
38 SET(xp[k*m+j])=z;
|
dawn@0
|
39 }
|
dawn@0
|
40 }
|
dawn@0
|
41 /*
|
dawn@0
|
42 for (j=0;j<m;j++) { // for each row (time)
|
dawn@0
|
43 sum=0;
|
dawn@0
|
44 SET(xp[j])=1;
|
dawn@0
|
45 for (k=1; k<n; k++) { // for each column (lag)
|
dawn@0
|
46 z=GET(xp[m*k+j]);
|
dawn@0
|
47 sum+=z;
|
dawn@0
|
48 mean=sum/k;
|
dawn@0
|
49 SET(xp[m*k+j]) = (mean > 0) ? z/mean : 1;
|
dawn@0
|
50 }
|
dawn@0
|
51 }
|
dawn@0
|
52 */
|
dawn@0
|
53
|
dawn@0
|
54
|
dawn@0
|
55 return;
|
dawn@0
|
56 }
|
dawn@0
|
57
|
dawn@0
|
58 void mexFunction(
|
dawn@0
|
59 int nlhs, mxArray *plhs[],
|
dawn@0
|
60 int nrhs, const mxArray *prhs[]
|
dawn@0
|
61 )
|
dawn@0
|
62 {
|
dawn@0
|
63 double *xp;
|
dawn@0
|
64 int nx, mx;
|
dawn@0
|
65
|
dawn@0
|
66 /* Check for proper number of arguments */
|
dawn@0
|
67 if (nrhs != 1) {
|
dawn@0
|
68 mexErrMsgTxt("CUMSUM_INPLACE takes 1 input argument");
|
dawn@0
|
69 }
|
dawn@0
|
70
|
dawn@0
|
71 /* Check type of input */
|
dawn@0
|
72 if (!mxIsNumeric(X_IN) || mxIsComplex(X_IN) ||
|
dawn@0
|
73 mxIsSparse(X_IN) || !mxIsDouble(X_IN) ) {
|
dawn@0
|
74 mexErrMsgTxt("CUMSUM_INPLACE: X should be doubles");
|
dawn@0
|
75 }
|
dawn@0
|
76 mx=mxGetM(X_IN); /* rows */
|
dawn@0
|
77 nx=mxGetN(X_IN); /* columns */
|
dawn@0
|
78 if (nx*mx == 0) {
|
dawn@0
|
79 mexErrMsgTxt("CUMSUM_INPLACE: input matrix is empty");
|
dawn@0
|
80 }
|
dawn@0
|
81
|
dawn@0
|
82 xp = mxGetPr(X_IN);
|
dawn@0
|
83 checkin_matrix((mxArray *) X_IN);
|
dawn@0
|
84
|
dawn@0
|
85
|
dawn@0
|
86 /* Do the actual computations in a subroutine */
|
dawn@0
|
87 cumsum_inplace(xp,mx,nx);
|
dawn@0
|
88
|
dawn@0
|
89 checkout_matrix((mxArray *) X_IN);
|
dawn@0
|
90 return;
|
dawn@0
|
91 }
|
dawn@0
|
92
|