55 lines
960 B
C
55 lines
960 B
C
|
|
#include <math.h>
|
|
#include "nrutil.h"
|
|
#define TINY 1.0e-30
|
|
|
|
void cntab2(nn,ni,nj,h,hx,hy,hygx,hxgy,uygx,uxgy,uxy)
|
|
float *h,*hx,*hxgy,*hy,*hygx,*uxgy,*uxy,*uygx;
|
|
int **nn,ni,nj;
|
|
{
|
|
int i,j;
|
|
float sum=0.0,p,*sumi,*sumj;
|
|
|
|
sumi=vector(1,ni);
|
|
sumj=vector(1,nj);
|
|
for (i=1;i<=ni;i++) {
|
|
sumi[i]=0.0;
|
|
for (j=1;j<=nj;j++) {
|
|
sumi[i] += nn[i][j];
|
|
sum += nn[i][j];
|
|
}
|
|
}
|
|
for (j=1;j<=nj;j++) {
|
|
sumj[j]=0.0;
|
|
for (i=1;i<=ni;i++)
|
|
sumj[j] += nn[i][j];
|
|
}
|
|
*hx=0.0;
|
|
for (i=1;i<=ni;i++)
|
|
if (sumi[i]) {
|
|
p=sumi[i]/sum;
|
|
*hx -= p*log(p);
|
|
}
|
|
*hy=0.0;
|
|
for (j=1;j<=nj;j++)
|
|
if (sumj[j]) {
|
|
p=sumj[j]/sum;
|
|
*hy -= p*log(p);
|
|
}
|
|
*h=0.0;
|
|
for (i=1;i<=ni;i++)
|
|
for (j=1;j<=nj;j++)
|
|
if (nn[i][j]) {
|
|
p=nn[i][j]/sum;
|
|
*h -= p*log(p);
|
|
}
|
|
*hygx=(*h)-(*hx);
|
|
*hxgy=(*h)-(*hy);
|
|
*uygx=(*hy-*hygx)/(*hy+TINY);
|
|
*uxgy=(*hx-*hxgy)/(*hx+TINY);
|
|
*uxy=2.0*(*hx+*hy-*h)/(*hx+*hy+TINY);
|
|
free_vector(sumj,1,nj);
|
|
free_vector(sumi,1,ni);
|
|
}
|
|
#undef TINY
|