⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 estmutualinfo.cpp

📁 这个压缩包含有跨平台的、独立的程序源码
💻 CPP
字号:
//=========================================================////This is a prog in the MutualInfo 0.9 package written by// Hanchuan Peng.////Disclaimer: The author of program is Hanchuan Peng//      at <penghanchuan@yahoo.com> and <phc@cbmv.jhu.edu>.////The CopyRight is reserved by the author.////Last modification: Oct/23/2005: fix a programming bug which has not effect in mutualinfo.m (which does not really call that piece of code)////========================================================////function to calculate the mutual information from joint and marginal probabilities//by Hanchuan Peng//April/2000// calculate the mutual information based on thr probabilities// through a probability based method// MI = sum(p(a,b)log(p(a,b)/p(a)/p(b)))//// function mival = estmutualinfo(pab,pa,pb,displayflag)//input parameters:  pab--the joint probility density of model and image intensity//                   pa--marign probility density of the model//                   pb--marign probility density of the model//output parameters: hab-- the mutual information#include "miinclude.h"void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){  if(nrhs != 3 && nrhs!=1)    mexErrMsgTxt("Usage [mutual_info] = progname(jointprob_table, marginprob_1, marginprob2). The last two inputs are optional.");  if(nlhs > 1)    mexErrMsgTxt("Too many output argument <mutual_info>.");  //check if parameters are correct  long i,j;  double *pab = mxGetPr(prhs[0]);  long pabhei = mxGetM(prhs[0]);  long pabwid = mxGetN(prhs[0]);  double **pab2d = new double * [pabwid];  for(j=0;j<pabwid;j++)    pab2d[j] = pab + (long)j*pabhei;  double *p1,*p2;  long p1len,p2len;  int b_findmarginalprob = 0;  if(nrhs==3)  {    p1 = mxGetPr(prhs[1]);    p1len = mxGetM(prhs[1])*mxGetN(prhs[1]);    p2 = mxGetPr(prhs[2]);    p2len = mxGetM(prhs[2])*mxGetN(prhs[2]);    if(p1len!=pabhei || p2len!=pabwid)    {      if(p1len==pabwid && p2len==pabhei)      {	p1 = mxGetPr(prhs[2]);	p1len = mxGetM(prhs[2])*mxGetN(prhs[2]);	p2 = mxGetPr(prhs[1]);	p2len = mxGetM(prhs[1])*mxGetN(prhs[1]);      }      else      {	printf("pab size (%i,%i) doesn't match pa size %i and pb size %i\n.",pabhei,pabwid,p1len,p2len);	b_findmarginalprob = 1;      }    }  }  else  {    b_findmarginalprob = 1;  }  //generate marginal probability arrays when necessary  if (b_findmarginalprob!=0)  {    p1len = pabhei;    p2len = pabwid;    p1 = new double[p1len];    p2 = new double[p2len];    for(i=0;i<p1len;i++) p1[i] = 0;    for(j=0;j<p2len;j++) p2[j] = 0; //fix bug on 051023, -- this will have lead to seg fault or unpredicted res if p1len!=p2len    for(i=0;i<p1len;i++) //p1len = pabhei    for(j=0;j<p2len;j++) //p2len = panwid    {      //printf("%f ",pab2d[j][i]);      p1[i] += pab2d[j][i];      p2[j] += pab2d[j][i];    }  }  //calculate the mutual information  plhs[0] = mxCreateDoubleMatrix(1,1, mxREAL);  double *mInf = mxGetPr(plhs[0]);  double muInf = 0;    muInf = 0.0;  for (j=0;j<pabwid;j++) // should for p2   {    for (i=0;i<pabhei;i++) // should for p1    {      if (pab2d[j][i]!=0 && p1[i]!=0 && p2[j]!=0)      {	muInf += pab2d[j][i] * log(pab2d[j][i]/p1[i]/p2[j]); 	//printf("%f %fab %fa %fb\n",muInf,pab2d[j][i]/p1[i]/p2[j],p1[i],p2[j]);      }    }  }  muInf /= log(2);  mInf[0] = muInf;  //free memory  if(pab2d){delete []pab2d;}  if(b_findmarginalprob!=0)  {    if(p1) {delete []p1;}    if(p2) {delete []p2;}  }  return;}

⌨️ 快捷键说明

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