marg_table_ndxd.c

来自「麻省理工学院的人工智能工具箱,很珍贵,希望对大家有用!」· C语言 代码 · 共 83 行

C
83
字号
/* C mex version for marg_table_ndxD.m in potential/Tables directory  */

#include "mex.h"

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){
	double  *pb, *ps;
	int     i, j, I, J, N, pointer, temp, maximize;
	int     *ndx;
	char    *used;

	N = mxGetNumberOfElements(prhs[0]);
	pb = mxGetPr(prhs[0]);
	maximize = (int)mxGetScalar(prhs[1]);
	ndx = mxGetData(prhs[2]);
	J = mxGetNumberOfElements(prhs[2]);
	I = N / J;

	if(J == 1){
		plhs[0] = mxDuplicateArray(prhs[0]);
		return;
	}

	if(I == 1){
		plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
		ps = mxGetPr(plhs[0]);
		if(maximize){
			for(i=0; i<N; i++){
				*ps = (*ps < *pb)? *pb : *ps;
				pb++;
			}
		}
		else{
			for(i=0; i<N; i++){
				*ps += *pb++;
			}
		}
		return;
	}

	plhs[0] = mxCreateDoubleMatrix(I, 1, mxREAL);
	ps = mxGetPr(plhs[0]);

	used = (char *)malloc(N * sizeof(char));
	for(i=0; i<N; i++){
		used[i] = 0;
	}
	pointer = 0;

	if(maximize){
		for(i=0; i<I; i++){
			while(used[pointer]){
				pointer++;
			}
			temp = pointer;
			used[pointer] = 1;
			for(j=0; j<J; j++){
				temp = pointer + ndx[j];
				*ps = (*ps < pb[temp])? pb[temp] : *ps;
				used[temp] = 1;
			}
			ps++;
			pointer++;
		}
	}
	else{
		for(i=0; i<I; i++){
			while(used[pointer]){
				pointer++;
			}
			temp = pointer;
			used[pointer] = 1;
			for(j=0; j<J; j++){
				temp = pointer + ndx[j];
				*ps += pb[temp];
				used[temp] = 1;
			}
			ps++;
			pointer++;
		}
	}
	free(used);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?