Mercurial > hg > camir-aes2014
diff toolboxes/distance_learning/mlr/util/cummax.c @ 0:e9a9cd732c1e tip
first hg version after svn
author | wolffd |
---|---|
date | Tue, 10 Feb 2015 15:05:51 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toolboxes/distance_learning/mlr/util/cummax.c Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,58 @@ +/* CREATED:2010-01-08 17:25:37 by Brian McFee <bmcfee@cs.ucsd.edu> */ +/* cummax.c + * + * cumulative maximum (analogous to cumsum) + * + * Compile: + * mex cummax.c + */ + +#include "mex.h" + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) +{ + /* Declare variables */ + int n; /* number of elements */ + double *pi; /* input array */ + double *po1, *po2; /* output array(s) */ + double currentMax; + double currentMaxPointer; + int i; + + if (nrhs != 1) { + mexErrMsgTxt("Only one input argument is required."); + } + if (nlhs > 2) { + mexErrMsgTxt("Too many output arguments."); + } + + if (!(mxIsDouble(prhs[0]))) { + mexErrMsgTxt("Input array must be of type double."); + } + + n = mxGetNumberOfElements(prhs[0]); + pi = (double *)mxGetPr(prhs[0]); + + plhs[0] = mxCreateDoubleMatrix(1, n, mxREAL); + po1 = mxGetPr(plhs[0]); + + plhs[1] = mxCreateDoubleMatrix(1, n, mxREAL); + po2 = mxGetPr(plhs[1]); + + /* Now for the meat */ + + currentMax = pi[0]; + currentMaxPointer = 1; + for (i = 0; i < n; i++) { + if (pi[i] > currentMax) { + currentMax = pi[i]; + currentMaxPointer = i + 1; + } + po1[i] = currentMax; + po2[i] = currentMaxPointer; + } + + mxSetN(plhs[0], n); + mxSetN(plhs[1], n); + +}