diff toolboxes/FullBNT-1.0.7/KPMtools/ind2subvKPM.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/ind2subvKPM.c	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,176 @@
+/* C mex version of ind2subv.m in misc directory */
+/* 2 input, 1 output         */
+/* siz, ndx                  */
+/* sub                       */
+
+#include "mex.h"
+#include <math.h>
+
+void rbinary(int num, int n, double *rbits){
+	int i, mask;
+	num = num - 1;
+
+	mask = 1 << (n-1); /* mask = 00100...0 , where the 1 is in column n (rightmost = col 1) */
+	for (i = 0; i < n; i++) {
+		rbits[n-i-1] = ((num & mask) == 0) ? 1 : 2;
+		num <<= 1;
+	}
+}
+
+void ind_subv(int num, const double *sizes, int n, double *rbits){
+	int i;
+	int *cumprod;
+
+	cumprod  = malloc(n * sizeof(int));
+	num = num - 1;
+	cumprod[0] = 1;
+	for (i = 0; i < n-1; i++)
+	cumprod[i+1] = cumprod[i] * (int)sizes[i];
+	for (i = n-1; i >= 0; i--) {
+		rbits[i] = ((int)floor(num / cumprod[i])) + 1;
+		num = num % cumprod[i];
+	}
+	free(cumprod);
+}
+
+
+void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){
+	int    i, j, k, nCol, nRow, nnRow, binary, count, temp, temp1, start;
+	double *pSize, *pNdx, *pr;
+	double ndx;
+	int    *subv, *cumprod, *templai;
+
+	pSize = mxGetPr(prhs[0]);
+	pNdx = mxGetPr(prhs[1]);
+	nCol = mxGetNumberOfElements(prhs[0]);
+	nnRow = mxGetNumberOfElements(prhs[1]);
+
+	nRow = 1;
+	for(i=0; i<nCol; i++){
+		nRow *= (int)pSize[i];
+	}
+
+	if(nCol == 0){
+		plhs[0] = mxDuplicateArray(prhs[1]);
+		return;
+	}
+
+	binary = 2;
+	for (i = 0; i < nCol; i++){
+		if (pSize[i] > 2.0){
+			binary = 0;
+			break;
+		}
+		else if((int)pSize[i] == 1){
+			binary = 1;
+		}
+	}
+
+	if(nnRow == 1){
+		ndx = mxGetScalar(prhs[1]);
+		plhs[0] = mxCreateDoubleMatrix(1, nCol, mxREAL);
+		pr = mxGetPr(plhs[0]);
+		if(binary == 2)rbinary((int)ndx, nCol, pr);
+		else ind_subv((int)ndx, pSize, nCol, pr);
+		return;
+	}
+
+	plhs[0] = mxCreateDoubleMatrix(nnRow, nCol, mxREAL);
+	pr = mxGetPr(plhs[0]);
+
+	subv = malloc(nRow * nCol * sizeof(int));
+
+	if (binary == 2) {
+		for(j=0; j<nCol; j++){
+			temp = (1 << j);
+			temp1 = j * nRow;
+			for(i=0; i<nRow; i++){
+				subv[temp1 + i] = ((i & temp) == 0) ? 1 : 2;
+			}
+		}
+	}
+	else if(binary == 1){
+		cumprod = (int *)malloc(nCol * sizeof(int));
+		templai = (int *)malloc(nCol * sizeof(int));
+		cumprod[0] = 1;
+		templai[0] = nRow;
+		for(i=1; i<nCol; i++){
+			k = (int)pSize[i-1] - 1;
+			cumprod[i] = cumprod[i-1] << k;
+			templai[i] = templai[i-1] >> k;
+		}
+		for(j=0; j<nCol; j++){
+			temp1 = j * nRow;
+			if(pSize[j] == 1.0){
+				for(i=0; i<nRow; i++){
+					subv[temp1 + i] = 1;
+				}
+			}
+			else{
+				temp = 1;
+				count = 0;
+				for(i=0; i<templai[j]; i++){
+					if(temp > 2) temp = 1;
+					for(k=0; k<cumprod[j]; k++){
+						subv[temp1 + count] = temp;
+                        count++;
+					}
+					temp++;
+				}
+			}
+		}
+		free(templai);
+		free(cumprod);
+	}
+	else {
+		cumprod = (int *)malloc(nCol * sizeof(int));
+		templai = (int *)malloc(nCol * sizeof(int));
+		cumprod[0] = 1;
+		for(i=1; i<nCol; i++){
+			cumprod[i] = (int)(cumprod[i-1] * pSize[i-1]);
+		}
+		templai[0] = nRow;
+		for(i=1; i<nCol; i++){
+			templai[i] = nRow / cumprod[i];
+		}
+		for(j=0; j<nCol; j++){
+			temp1 = j * nRow;
+			if(pSize[j] == 1.0){
+				for(i=0; i<nRow; i++){
+					subv[temp1 + i] = 1;
+				}
+			}
+			else{
+				temp = 1;
+				count = 0;
+				for(i=0; i<templai[j]; i++){
+					if(temp > (int)pSize[j]) temp = 1;
+					for(k=0; k<cumprod[j]; k++){
+						subv[temp1 + count] = temp;
+						count++;
+					}
+					temp++;
+				}
+			}
+		}
+		free(cumprod);
+		free(templai);
+	}
+
+	count = 0;
+	for(j=0; j<nCol; j++){
+		temp1 = j * nRow;
+		for(i=0; i<nnRow; i++){
+			start = (int)pNdx[i] - 1;
+			pr[count] = subv[temp1 + start];
+			count++;
+		}
+	}
+	free(subv);
+}
+
+
+
+
+
+