Mercurial > hg > camir-aes2014
diff toolboxes/FullBNT-1.0.7/KPMtools/subv2indKPM.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/FullBNT-1.0.7/KPMtools/subv2indKPM.c Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,89 @@ +/* C mex version of subv2ind*/ +/* 2 inputs, 1 output */ +/* siz, subv */ +/* ndx */ +#include "mex.h" + +void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){ + int i, j, k, nCol, nRow, binary, temp; + double *pSize, *pSubv, *pr; + int *cumprod; + + pSize = mxGetPr(prhs[0]); + pSubv = mxGetPr(prhs[1]); + nCol = mxGetNumberOfElements(prhs[0]); + nRow = mxGetM(prhs[1]); + + + if(mxIsEmpty(prhs[1])){ + plhs[0] = mxCreateDoubleMatrix(0, 0, mxREAL); + return; + } + + if(mxIsEmpty(prhs[0])){ + plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL); + *mxGetPr(plhs[0]) = 1; + return; + } + + binary = 2; + for (i = 0; i < nCol; i++){ + if (pSize[i] > 2.0){ + binary = 0; + break; + } + else if(pSize[i] == 1.0){ + binary = 1; + } + } + + plhs[0] = mxCreateDoubleMatrix(nRow, 1, mxREAL); + pr = mxGetPr(plhs[0]); + for(i=0; i<nRow; i++){ + pr[i] = 1.0; + } + + if (binary == 2){ + for(j=0; j<nCol; j++){ + temp = j * nRow; + for(i=0; i<nRow; i++){ + pr[i] += ((int)pSubv[temp + i] - 1) << j; + } + } + } + else if(binary == 1){ + cumprod = malloc(nCol * sizeof(int)); + cumprod[0] = 1; + for(i=1; i<nCol; i++){ + k = (int)pSize[i-1] - 1; + cumprod[i] = cumprod[i-1] << k; + } + for(j=0; j<nCol; j++){ + temp = j * nRow; + for(i=0; i<nRow; i++){ + k = (int)pSubv[temp + i] - 1; + if(k)pr[i] += cumprod[j]; + } + } + free(cumprod); + } + else { + cumprod = malloc(nCol * sizeof(int)); + cumprod[0] = 1; + for(i=1; i<nCol; i++){ + k = (int)pSize[i-1]; + cumprod[i] = cumprod[i-1] * k; + } + for(j=0; j<nCol; j++){ + temp = j * nRow; + for(i=0; i<nRow; i++){ + k = (int)pSubv[temp + i] - 1; + pr[i] += cumprod[j] * k; + } + } + free(cumprod); + } +} + + +