add numerical recipes library
This commit is contained in:
54
lib/nr/k_and_r/recipes/cntab2.c
Normal file
54
lib/nr/k_and_r/recipes/cntab2.c
Normal file
@@ -0,0 +1,54 @@
|
||||
|
||||
#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
|
||||
Reference in New Issue
Block a user