Recipes.cpp
上传用户:szb0815
上传日期:2007-06-13
资源大小:338k
文件大小:35k
源码类别:

生物技术

开发平台:

C++ Builder

  1. //---------------------------------------------------------------------------
  2. #pragma hdrstop
  3. #include "Recipes.h"
  4. float *circx,*circy,*circw;
  5. int circn;
  6. //---------------------------------------------------------------------------
  7. #pragma package(smart_init)
  8. #include <math.h>
  9. #define NRANSI #define EPS 1.0e-7 void medfit(float x[], float y[], int ndata, float *a, float *b, float *abdev) { float rofunc(float b); int j; float bb,b1,b2,del,f,f1,f2,sigb,temp; float sx=0.0,sy=0.0,sxy=0.0,sxx=0.0,chisq=0.0; ndatat=ndata; xt=x; yt=y; for (j=1;j<=ndata;j++) { sx += x[j]; sy += y[j]; sxy += x[j]*y[j]; sxx += x[j]*x[j]; } del=ndata*sxx-sx*sx; aa=(sxx*sy-sx*sxy)/del; bb=(ndata*sxy-sx*sy)/del; for (j=1;j<=ndata;j++) chisq += (temp=y[j]-(aa+bb*x[j]),temp*temp); sigb=sqrt(chisq/del); b1=bb; f1=rofunc(b1); b2=bb+SIGN(3.0*sigb,f1); f2=rofunc(b2); if (b2 == b1) { *a=aa; *b=bb; *abdev=abdevt/ndata; return; } while (f1*f2 > 0.0) { bb=b2+1.6*(b2-b1); b1=b2; f1=f2; b2=bb; f2=rofunc(b2); } sigb=0.01*sigb; while (fabs(b2-b1) > sigb) { bb=b1+0.5*(b2-b1); if (bb == b1 || bb == b2) break; f=rofunc(bb); if (f*f1 >= 0.0) { f1=f; b1=bb; } else { f2=f; b2=bb; } } *a=aa; *b=bb; *abdev=abdevt/ndata; }
  10. float rofunc(float b) { //float select(unsigned long k, unsigned long n, float arr[]); int j; float *arr,d,sum=0.0; arr = new float[ndatat+1]; for (j=1;j<=ndatat;j++)         {             arr[j]=yt[j]-b*xt[j];         } if (ndatat & 1) { aa=select((ndatat+1)>>1,ndatat,arr); } else { j=ndatat >> 1; aa=0.5*(select(j,ndatat,arr)+select(j+1,ndatat,arr)); } abdevt=0.0; for (j=1;j<=ndatat;j++) { d=yt[j]-(b*xt[j]+aa); abdevt += fabs(d); if (yt[j] != 0.0) d /= fabs(yt[j]); if (fabs(d) > EPS) sum += (d >= 0.0 ? xt[j] : -xt[j]); }         delete arr; return sum; } float select(unsigned long k, unsigned long n, float arr[]) { unsigned long i,ir,j,l,mid; float a,temp; l=1; ir=n; for (;;) { if (ir <= l+1) { if (ir == l+1 && arr[ir] < arr[l]) { SWAP(arr[l],arr[ir]) } return arr[k]; } else { mid=(l+ir) >> 1; SWAP(arr[mid],arr[l+1]) if (arr[l] > arr[ir]) { SWAP(arr[l],arr[ir]) } if (arr[l+1] > arr[ir]) { SWAP(arr[l+1],arr[ir]) } if (arr[l] > arr[l+1]) { SWAP(arr[l],arr[l+1]) } i=l+1; j=ir; a=arr[l+1]; for (;;) { do i++; while (arr[i] < a); do j--; while (arr[j] > a); if (j < i) break; SWAP(arr[i],arr[j]) } arr[l+1]=arr[j]; arr[j]=a; if (j >= k) ir=j-1; if (j <= k) l=i; } } } #undef SWAP #undef EPS #undef NRANSI
  11. float fcircfit(float p[])
  12. {
  13.         int i;
  14.         float val = 0;
  15.         float val1,val2;
  16.         for (i=1;i<=circn;i++)
  17.         {
  18.                 val1 = sqrt(pow(circx[i]-p[1],2)+pow(circy[i]-p[2],2));
  19.                 val2 = val1 - p[3];
  20.                 val += circw[i] * pow(val2,2);
  21.         }
  22.         return val;
  23. }
  24. void fcircderiv(float p[], float xi[])
  25. {
  26.         int i;
  27.         float val1,val2;
  28.         xi[1] = 0;
  29.         xi[2] = 0;
  30.         xi[3] = 0;
  31.         for (i=1;i<=circn;i++)
  32.         {
  33.                 val1 = sqrt(pow(circx[i]-p[1],2)+pow(circy[i]-p[2],2));
  34.                 val2 = val1 - p[3];
  35.                 if (val1 > 0)
  36.                 {
  37.                 xi[1] += circw[i] * 2*p[1]*val2*(circx[i] - p[1])/val1;
  38.                 xi[2] += circw[i] * 2*p[2]*val2*(circy[i] - p[2])/val1;
  39.                 xi[3] += circw[i] * 2 * val2;
  40.                 }
  41.         }
  42. }
  43. #define ITMAX 200
  44. #define EPS 1.0e-10 #define FREEALL free_vector(xi,1,n);free_vector(h,1,n);free_vector(g,1,n); void frprmn(float p[], int n, float ftol, int *iter, float *fret, float (*func)(float []), void (*dfunc)(float [], float [])) { void linmin(float p[], float xi[], int n, float *fret, float (*func)(float [])); int j,its; float gg,gam,fp,dgg; float *g,*h,*xi; g=vector(1,n); h=vector(1,n); xi=vector(1,n); fp=(*func)(p); (*dfunc)(p,xi); for (j=1;j<=n;j++) { g[j] = -xi[j]; xi[j]=h[j]=g[j]; } for (its=1;its<=ITMAX;its++) { *iter=its; linmin(p,xi,n,fret,func); if (2.0*fabs(*fret-fp) <= ftol*(fabs(*fret)+fabs(fp)+EPS)) { FREEALL return; } fp=(*func)(p); (*dfunc)(p,xi); dgg=gg=0.0; for (j=1;j<=n;j++) { gg += g[j]*g[j]; dgg += (xi[j]+g[j])*xi[j]; } if (gg == 0.0) { FREEALL return; } gam=dgg/gg; for (j=1;j<=n;j++) { g[j] = -xi[j]; xi[j]=h[j]=g[j]+gam*h[j]; } } nrerror("Too many iterations in frprmn"); } #undef ITMAX #undef EPS #undef FREEALL #define TOL 2.0e-4 void linmin(float p[], float xi[], int n, float *fret, float (*func)(float [])) { float brent(float ax, float bx, float cx, float (*f)(float), float tol, float *xmin); float f1dim(float x); void mnbrak(float *ax, float *bx, float *cx, float *fa, float *fb, float *fc, float (*func)(float)); int j; float xx,xmin,fx,fb,fa,bx,ax; ncom=n; pcom=vector(1,n); xicom=vector(1,n); nrfunc=func; for (j=1;j<=n;j++) { pcom[j]=p[j]; xicom[j]=xi[j]; } ax=0.0; xx=1.0; mnbrak(&ax,&xx,&bx,&fa,&fx,&fb,f1dim); *fret=brent(ax,xx,bx,f1dim,TOL,&xmin); for (j=1;j<=n;j++) { xi[j] *= xmin; p[j] += xi[j]; } free_vector(xicom,1,n); free_vector(pcom,1,n); }
  45. #undef TOL
  46. #define ITMAX 100
  47. #define CGOLD 0.3819660 #define ZEPS 1.0e-10 #define SHFT(a,b,c,d) (a)=(b);(b)=(c);(c)=(d); float brent(float ax, float bx, float cx, float (*f)(float), float tol, float *xmin) { int iter; float a,b,d,etemp,fu,fv,fw,fx,p,q,r,tol1,tol2,u,v,w,x,xm; float e=0.0; a=(ax < cx ? ax : cx); b=(ax > cx ? ax : cx); x=w=v=bx; fw=fv=fx=(*f)(x); for (iter=1;iter<=ITMAX;iter++) { xm=0.5*(a+b); tol2=2.0*(tol1=tol*fabs(x)+ZEPS); if (fabs(x-xm) <= (tol2-0.5*(b-a))) { *xmin=x; return fx; } if (fabs(e) > tol1) { r=(x-w)*(fx-fv); q=(x-v)*(fx-fw); p=(x-v)*q-(x-w)*r; q=2.0*(q-r); if (q > 0.0) p = -p; q=fabs(q); etemp=e; e=d; if (fabs(p) >= fabs(0.5*q*etemp) || p <= q*(a-x) || p >= q*(b-x)) d=CGOLD*(e=(x >= xm ? a-x : b-x)); else { d=p/q; u=x+d; if (u-a < tol2 || b-u < tol2) d=SIGN(tol1,xm-x); } } else { d=CGOLD*(e=(x >= xm ? a-x : b-x)); } u=(fabs(d) >= tol1 ? x+d : x+SIGN(tol1,d)); fu=(*f)(u); if (fu <= fx) { if (u >= x) a=x; else b=x; SHFT(v,w,x,u) SHFT(fv,fw,fx,fu) } else { if (u < x) a=u; else b=u; if (fu <= fw || w == x) { v=w; w=u; fv=fw; fw=fu; } else if (fu <= fv || v == x || v == w) { v=u; fv=fu; } } } nrerror("Too many iterations in brent"); }
  48. #undef ITMAX
  49. #undef CGOLD
  50. #undef ZEPS
  51. #undef SHFT
  52. #define GOLD 1.618034
  53. #define GLIMIT 100.0 #define TINY 1.0e-20 #define SHFT(a,b,c,d) (a)=(b);(b)=(c);(c)=(d); void mnbrak(float *ax, float *bx, float *cx, float *fa, float *fb, float *fc, float (*func)(float)) { float ulim,u,r,q,fu,dum; *fa=(*func)(*ax); *fb=(*func)(*bx); if (*fb > *fa) { SHFT(dum,*ax,*bx,dum) SHFT(dum,*fb,*fa,dum) } *cx=(*bx)+GOLD*(*bx-*ax); *fc=(*func)(*cx); while (*fb > *fc) { r=(*bx-*ax)*(*fb-*fc); q=(*bx-*cx)*(*fb-*fa); u=(*bx)-((*bx-*cx)*q-(*bx-*ax)*r)/ (2.0*SIGN(FMAX(fabs(q-r),TINY),q-r)); ulim=(*bx)+GLIMIT*(*cx-*bx); if ((*bx-u)*(u-*cx) > 0.0) { fu=(*func)(u); if (fu < *fc) { *ax=(*bx); *bx=u; *fa=(*fb); *fb=fu; return; } else if (fu > *fb) { *cx=u; *fc=fu; return; } u=(*cx)+GOLD*(*cx-*bx); fu=(*func)(u); } else if ((*cx-u)*(u-ulim) > 0.0) { fu=(*func)(u); if (fu < *fc) { SHFT(*bx,*cx,u,*cx+GOLD*(*cx-*bx)) SHFT(*fb,*fc,fu,(*func)(u)) } } else if ((u-ulim)*(ulim-*cx) >= 0.0) { u=ulim; fu=(*func)(u); } else { u=(*cx)+GOLD*(*cx-*bx); fu=(*func)(u); } SHFT(*ax,*bx,*cx,u) SHFT(*fa,*fb,*fc,fu) } } #undef GOLD #undef GLIMIT #undef TINY #undef SHFT
  54. float f1dim(float x)
  55. { int j; float f,*xt; xt=vector(1,ncom); for (j=1;j<=ncom;j++) xt[j]=pcom[j]+x*xicom[j]; f=(*nrfunc)(xt); free_vector(xt,1,ncom); return f; }
  56. void kstwo(float data1[], unsigned long n1, float data2[], unsigned long n2,
  57. float *d, float *prob) { float probks(float alam); void sort(unsigned long n, float arr[]); unsigned long j1=1,j2=1; float d1,d2,dt,en1,en2,en,fn1=0.0,fn2=0.0; sort(n1,data1); sort(n2,data2); en1=n1; en2=n2; *d=0.0; while (j1 <= n1 && j2 <= n2) { if ((d1=data1[j1]) <= (d2=data2[j2])) fn1=j1++/en1; if (d2 <= d1) fn2=j2++/en2; if ((dt=fabs(fn2-fn1)) > *d) *d=dt; } en=sqrt(en1*en2/(en1+en2)); *prob=probks((en+0.12+0.11/en)*(*d)); }
  58. #define EPS1 0.001
  59. #define EPS2 1.0e-8 float probks(float alam) { int j; float a2,fac=2.0,sum=0.0,term,termbf=0.0; a2 = -2.0*alam*alam; for (j=1;j<=100;j++) { term=fac*exp(a2*j*j); sum += term; if (fabs(term) <= EPS1*termbf || fabs(term) <= EPS2*sum) return sum; fac = -fac; termbf=fabs(term); } return 1.0; } #undef EPS1 #undef EPS2
  60. #define SWAP(a,b) temp=(a);(a)=(b);(b)=temp;
  61. #define M 7 #define NSTACK 50 void sort(unsigned long n, float arr[]) { unsigned long i,ir=n,j,k,l=1; int jstack=0,*istack; float a,temp; istack=ivector(1,NSTACK); for (;;) { if (ir-l < M) { for (j=l+1;j<=ir;j++) { a=arr[j]; for (i=j-1;i>=l;i--) { if (arr[i] <= a) break; arr[i+1]=arr[i]; } arr[i+1]=a; } if (jstack == 0) break; ir=istack[jstack--]; l=istack[jstack--]; } else { k=(l+ir) >> 1; SWAP(arr[k],arr[l+1]) if (arr[l] > arr[ir]) { SWAP(arr[l],arr[ir]) } if (arr[l+1] > arr[ir]) { SWAP(arr[l+1],arr[ir]) } if (arr[l] > arr[l+1]) { SWAP(arr[l],arr[l+1]) } i=l+1; j=ir; a=arr[l+1]; for (;;) { do i++; while (arr[i] < a); do j--; while (arr[j] > a); if (j < i) break; SWAP(arr[i],arr[j]); } arr[l+1]=arr[j]; arr[j]=a; jstack += 2; if (jstack > NSTACK) nrerror("NSTACK too small in sort."); if (ir-i+1 >= j-l) { istack[jstack]=ir; istack[jstack-1]=i; ir=j-1; } else { istack[jstack]=j-1; istack[jstack-1]=l; l=i; } } } free_ivector(istack,1,NSTACK); } #undef M #undef NSTACK #undef SWAP #undef NRANSI
  62. #define NRANSI
  63. #define SWAP(a,b) temp=(a);(a)=(b);(b)=temp; #define M 7 #define NSTACK 50
  64. void sort2fi(unsigned long n, float arr[], int brr[])
  65. { unsigned long i,ir=n,j,k,l=1; int *istack,jstack=0; float a,temp;         int b; istack=ivector(1,NSTACK); for (;;) { if (ir-l < M) { for (j=l+1;j<=ir;j++) { a=arr[j]; b=brr[j]; for (i=j-1;i>=l;i--) { if (arr[i] <= a) break; arr[i+1]=arr[i]; brr[i+1]=brr[i]; } arr[i+1]=a; brr[i+1]=b; } if (!jstack) { free_ivector(istack,1,NSTACK); return; } ir=istack[jstack]; l=istack[jstack-1]; jstack -= 2; } else { k=(l+ir) >> 1; SWAP(arr[k],arr[l+1]) SWAP(brr[k],brr[l+1]) if (arr[l] > arr[ir]) { SWAP(arr[l],arr[ir]) SWAP(brr[l],brr[ir]) } if (arr[l+1] > arr[ir]) { SWAP(arr[l+1],arr[ir]) SWAP(brr[l+1],brr[ir]) } if (arr[l] > arr[l+1]) { SWAP(arr[l],arr[l+1]) SWAP(brr[l],brr[l+1]) } i=l+1; j=ir; a=arr[l+1]; b=brr[l+1]; for (;;) { do i++; while (arr[i] < a); do j--; while (arr[j] > a); if (j < i) break; SWAP(arr[i],arr[j]) SWAP(brr[i],brr[j]) } arr[l+1]=arr[j]; arr[j]=a; brr[l+1]=brr[j]; brr[j]=b; jstack += 2; if (jstack > NSTACK) nrerror("NSTACK too small in sort2."); if (ir-i+1 >= j-l) { istack[jstack]=ir; istack[jstack-1]=i; ir=j-1; } else { istack[jstack]=j-1; istack[jstack-1]=l; l=i; } } } } #undef M #undef NSTACK #undef SWAP #undef NRANSI
  66. #define NRANSI
  67. #define SWAP(a,b) temp=(a);(a)=(b);(b)=temp; #define M 7 #define NSTACK 50
  68. void sort3fff(unsigned long n, float arr[], float brr[], float crr[])
  69. { unsigned long i,ir=n,j,k,l=1; int *istack,jstack=0; float a,temp;         float b,c; istack=ivector(1,NSTACK); for (;;) { if (ir-l < M) { for (j=l+1;j<=ir;j++) { a=arr[j]; b=brr[j];                                 c=crr[j]; for (i=j-1;i>=l;i--) { if (arr[i] <= a) break; arr[i+1]=arr[i]; brr[i+1]=brr[i];                                         crr[i+1]=crr[i]; } arr[i+1]=a; brr[i+1]=b;                                 crr[i+1]=c; } if (!jstack) { free_ivector(istack,1,NSTACK); return; } ir=istack[jstack]; l=istack[jstack-1]; jstack -= 2; } else { k=(l+ir) >> 1; SWAP(arr[k],arr[l+1]) SWAP(brr[k],brr[l+1])                         SWAP(crr[k],crr[l+1]) if (arr[l] > arr[ir]) { SWAP(arr[l],arr[ir]) SWAP(brr[l],brr[ir])                                 SWAP(crr[l],crr[ir]) } if (arr[l+1] > arr[ir]) { SWAP(arr[l+1],arr[ir]) SWAP(brr[l+1],brr[ir]) SWAP(crr[l+1],crr[ir]) } if (arr[l] > arr[l+1]) { SWAP(arr[l],arr[l+1]) SWAP(brr[l],brr[l+1]) SWAP(crr[l],crr[l+1]) } i=l+1; j=ir; a=arr[l+1]; b=brr[l+1];                         c=crr[l+1]; for (;;) { do i++; while (arr[i] < a); do j--; while (arr[j] > a); if (j < i) break; SWAP(arr[i],arr[j]) SWAP(brr[i],brr[j]) SWAP(crr[i],crr[j]) } arr[l+1]=arr[j]; arr[j]=a; brr[l+1]=brr[j]; brr[j]=b; crr[l+1]=crr[j]; crr[j]=c; jstack += 2; if (jstack > NSTACK) nrerror("NSTACK too small in sort2."); if (ir-i+1 >= j-l) { istack[jstack]=ir; istack[jstack-1]=i; ir=j-1; } else { istack[jstack]=j-1; istack[jstack-1]=l; l=i; } } } } #undef M #undef NSTACK #undef SWAP #undef NRANSI
  70. #include <math.h>
  71. #define TINY 1.0e-20 void pearsn(float x[], float y[], unsigned long n, float *r, float *prob, float *z) { float betai(float a, float b, float x); float erfcc(float x); unsigned long j; float yt,xt,t,df; float syy=0.0,sxy=0.0,sxx=0.0,ay=0.0,ax=0.0; for (j=1;j<=n;j++) { ax += x[j]; ay += y[j]; } ax /= n; ay /= n; for (j=1;j<=n;j++) { xt=x[j]-ax; yt=y[j]-ay; sxx += xt*xt; syy += yt*yt; sxy += xt*yt; } *r=sxy/(sqrt(sxx*syy)+TINY); *z=0.5*log((1.0+(*r)+TINY)/(1.0-(*r)+TINY)); df=n-2; t=(*r)*sqrt(df/((1.0-(*r)+TINY)*(1.0+(*r)+TINY))); *prob=betai(0.5*df,0.5,df/(df+t*t)); } #undef TINY
  72. float betai(float a, float b, float x)
  73. { float betacf(float a, float b, float x); float gammln(float xx); void nrerror(char error_text[]); float bt; if (x < 0.0 || x > 1.0) nrerror("Bad x in routine betai"); if (x == 0.0 || x == 1.0) bt=0.0; else bt=exp(gammln(a+b)-gammln(a)-gammln(b)+a*log(x)+b*log(1.0-x)); if (x < (a+1.0)/(a+b+2.0)) return bt*betacf(a,b,x)/a; else return 1.0-bt*betacf(b,a,1.0-x)/b; }
  74. float gammln(float xx) { double x,y,tmp,ser; static double cof[6]={76.18009172947146,-86.50532032941677, 24.01409824083091,-1.231739572450155, 0.1208650973866179e-2,-0.5395239384953e-5}; int j; y=x=xx; tmp=x+5.5; tmp -= (x+0.5)*log(tmp); ser=1.000000000190015; for (j=0;j<=5;j++) ser += cof[j]/++y; return -tmp+log(2.5066282746310005*ser/x); }
  75. #define MAXIT 100
  76. #define EPS 3.0e-7 #define FPMIN 1.0e-30 float betacf(float a, float b, float x) { void nrerror(char error_text[]); int m,m2; float aa,c,d,del,h,qab,qam,qap; qab=a+b; qap=a+1.0; qam=a-1.0; c=1.0; d=1.0-qab*x/qap; if (fabs(d) < FPMIN) d=FPMIN; d=1.0/d; h=d; for (m=1;m<=MAXIT;m++) { m2=2*m; aa=m*(b-m)*x/((qam+m2)*(a+m2)); d=1.0+aa*d; if (fabs(d) < FPMIN) d=FPMIN; c=1.0+aa/c; if (fabs(c) < FPMIN) c=FPMIN; d=1.0/d; h *= d*c; aa = -(a+m)*(qab+m)*x/((a+m2)*(qap+m2)); d=1.0+aa*d; if (fabs(d) < FPMIN) d=FPMIN; c=1.0+aa/c; if (fabs(c) < FPMIN) c=FPMIN; d=1.0/d; del=d*c; h *= del; if (fabs(del-1.0) < EPS) break; } if (m > MAXIT) nrerror("a or b too big, or MAXIT too small in betacf"); return h; } #undef MAXIT #undef EPS #undef FPMIN
  77. //---------------------------------------------------------------------------
  78. #include <math.h>
  79. #define NRANSI
  80. #include "nrutil.h"
  81. void spear(float data1[], float data2[], unsigned long n, float *d, float *zd,
  82. float *probd, float *rs, float *probrs)
  83. {
  84. float betai(float a, float b, float x);
  85. void crank(unsigned long n, float w[], float *s);
  86. float erfcc(float x);
  87. void sort2(unsigned long n, float arr[], float brr[]);
  88. unsigned long j;
  89. float vard,t,sg,sf,fac,en3n,en,df,aved,*wksp1,*wksp2;
  90. wksp1=vector(1,n);
  91. wksp2=vector(1,n);
  92. for (j=1;j<=n;j++) {
  93. wksp1[j]=data1[j];
  94. wksp2[j]=data2[j];
  95. }
  96. sort2(n,wksp1,wksp2);
  97. crank(n,wksp1,&sf);
  98. sort2(n,wksp2,wksp1);
  99. crank(n,wksp2,&sg);
  100. *d=0.0;
  101. for (j=1;j<=n;j++)
  102. *d += SQR(wksp1[j]-wksp2[j]);
  103. en=n;
  104. en3n=en*en*en-en;
  105. aved=en3n/6.0-(sf+sg)/12.0;
  106. fac=(1.0-sf/en3n)*(1.0-sg/en3n);
  107. vard=((en-1.0)*en*en*SQR(en+1.0)/36.0)*fac;
  108. *zd=(*d-aved)/sqrt(vard);
  109. *probd=erfcc(fabs(*zd)/1.4142136);
  110. *rs=(1.0-(6.0/en3n)*(*d+(sf+sg)/12.0))/sqrt(fac);
  111. fac=(*rs+1.0)*(1.0-(*rs));
  112. if (fac > 0.0) {
  113. t=(*rs)*sqrt((en-2.0)/fac);
  114. df=en-2.0;
  115. *probrs=betai(0.5*df,0.5,df/(df+t*t));
  116. } else
  117. *probrs=0.0;
  118. free_vector(wksp2,1,n);
  119. free_vector(wksp1,1,n);
  120. }
  121. #undef NRANSI
  122. #include <math.h>
  123. float gammln(float xx)
  124. {
  125. double x,y,tmp,ser;
  126. static double cof[6]={76.18009172947146,-86.50532032941677,
  127. 24.01409824083091,-1.231739572450155,
  128. 0.1208650973866179e-2,-0.5395239384953e-5};
  129. int j;
  130. y=x=xx;
  131. tmp=x+5.5;
  132. tmp -= (x+0.5)*log(tmp);
  133. ser=1.000000000190015;
  134. for (j=0;j<=5;j++) ser += cof[j]/++y;
  135. return -tmp+log(2.5066282746310005*ser/x);
  136. }
  137. #define NR_END 1
  138. #define FREE_ARG char*
  139. void nrerror(char error_text[])
  140. /* Numerical Recipes standard error handler */
  141. {
  142. fprintf(stderr,"Numerical Recipes run-time error...n");
  143. fprintf(stderr,"%sn",error_text);
  144. fprintf(stderr,"...now exiting to system...n");
  145. exit(1);
  146. }
  147. float *vector(long nl, long nh)
  148. /* allocate a float vector with subscript range v[nl..nh] */
  149. {
  150. float *v;
  151. v=(float *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(float)));
  152. if (!v) nrerror("allocation failure in vector()");
  153. return v-nl+NR_END;
  154. }
  155. int *ivector(long nl, long nh)
  156. /* allocate an int vector with subscript range v[nl..nh] */
  157. {
  158. int *v;
  159. v=(int *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(int)));
  160. if (!v) nrerror("allocation failure in ivector()");
  161. return v-nl+NR_END;
  162. }
  163. unsigned char *cvector(long nl, long nh)
  164. /* allocate an unsigned char vector with subscript range v[nl..nh] */
  165. {
  166. unsigned char *v;
  167. v=(unsigned char *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(unsigned char)));
  168. if (!v) nrerror("allocation failure in cvector()");
  169. return v-nl+NR_END;
  170. }
  171. unsigned long *lvector(long nl, long nh)
  172. /* allocate an unsigned long vector with subscript range v[nl..nh] */
  173. {
  174. unsigned long *v;
  175. v=(unsigned long *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(long)));
  176. if (!v) nrerror("allocation failure in lvector()");
  177. return v-nl+NR_END;
  178. }
  179. double *dvector(long nl, long nh)
  180. /* allocate a double vector with subscript range v[nl..nh] */
  181. {
  182. double *v;
  183. v=(double *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(double)));
  184. if (!v) nrerror("allocation failure in dvector()");
  185. return v-nl+NR_END;
  186. }
  187. float **matrix(long nrl, long nrh, long ncl, long nch)
  188. /* allocate a float matrix with subscript range m[nrl..nrh][ncl..nch] */
  189. {
  190. long i, nrow=nrh-nrl+1,ncol=nch-ncl+1;
  191. float **m;
  192. /* allocate pointers to rows */
  193. m=(float **) malloc((size_t)((nrow+NR_END)*sizeof(float*)));
  194. if (!m) nrerror("allocation failure 1 in matrix()");
  195. m += NR_END;
  196. m -= nrl;
  197. /* allocate rows and set pointers to them */
  198. m[nrl]=(float *) malloc((size_t)((nrow*ncol+NR_END)*sizeof(float)));
  199. if (!m[nrl]) nrerror("allocation failure 2 in matrix()");
  200. m[nrl] += NR_END;
  201. m[nrl] -= ncl;
  202. for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol;
  203. /* return pointer to array of pointers to rows */
  204. return m;
  205. }
  206. double **dmatrix(long nrl, long nrh, long ncl, long nch)
  207. /* allocate a double matrix with subscript range m[nrl..nrh][ncl..nch] */
  208. {
  209. long i, nrow=nrh-nrl+1,ncol=nch-ncl+1;
  210. double **m;
  211. /* allocate pointers to rows */
  212. m=(double **) malloc((size_t)((nrow+NR_END)*sizeof(double*)));
  213. if (!m) nrerror("allocation failure 1 in matrix()");
  214. m += NR_END;
  215. m -= nrl;
  216. /* allocate rows and set pointers to them */
  217. m[nrl]=(double *) malloc((size_t)((nrow*ncol+NR_END)*sizeof(double)));
  218. if (!m[nrl]) nrerror("allocation failure 2 in matrix()");
  219. m[nrl] += NR_END;
  220. m[nrl] -= ncl;
  221. for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol;
  222. /* return pointer to array of pointers to rows */
  223. return m;
  224. }
  225. int **imatrix(long nrl, long nrh, long ncl, long nch)
  226. /* allocate a int matrix with subscript range m[nrl..nrh][ncl..nch] */
  227. {
  228. long i, nrow=nrh-nrl+1,ncol=nch-ncl+1;
  229. int **m;
  230. /* allocate pointers to rows */
  231. m=(int **) malloc((size_t)((nrow+NR_END)*sizeof(int*)));
  232. if (!m) nrerror("allocation failure 1 in matrix()");
  233. m += NR_END;
  234. m -= nrl;
  235. /* allocate rows and set pointers to them */
  236. m[nrl]=(int *) malloc((size_t)((nrow*ncol+NR_END)*sizeof(int)));
  237. if (!m[nrl]) nrerror("allocation failure 2 in matrix()");
  238. m[nrl] += NR_END;
  239. m[nrl] -= ncl;
  240. for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol;
  241. /* return pointer to array of pointers to rows */
  242. return m;
  243. }
  244. float **submatrix(float **a, long oldrl, long oldrh, long oldcl, long oldch,
  245. long newrl, long newcl)
  246. /* point a submatrix [newrl..][newcl..] to a[oldrl..oldrh][oldcl..oldch] */
  247. {
  248. long i,j,nrow=oldrh-oldrl+1,ncol=oldcl-newcl;
  249. float **m;
  250. /* allocate array of pointers to rows */
  251. m=(float **) malloc((size_t) ((nrow+NR_END)*sizeof(float*)));
  252. if (!m) nrerror("allocation failure in submatrix()");
  253. m += NR_END;
  254. m -= newrl;
  255. /* set pointers to rows */
  256. for(i=oldrl,j=newrl;i<=oldrh;i++,j++) m[j]=a[i]+ncol;
  257. /* return pointer to array of pointers to rows */
  258. return m;
  259. }
  260. float **convert_matrix(float *a, long nrl, long nrh, long ncl, long nch)
  261. /* allocate a float matrix m[nrl..nrh][ncl..nch] that points to the matrix
  262. declared in the standard C manner as a[nrow][ncol], where nrow=nrh-nrl+1
  263. and ncol=nch-ncl+1. The routine should be called with the address
  264. &a[0][0] as the first argument. */
  265. {
  266. long i,j,nrow=nrh-nrl+1,ncol=nch-ncl+1;
  267. float **m;
  268. /* allocate pointers to rows */
  269. m=(float **) malloc((size_t) ((nrow+NR_END)*sizeof(float*)));
  270. if (!m) nrerror("allocation failure in convert_matrix()");
  271. m += NR_END;
  272. m -= nrl;
  273. /* set pointers to rows */
  274. m[nrl]=a-ncl;
  275. for(i=1,j=nrl+1;i<nrow;i++,j++) m[j]=m[j-1]+ncol;
  276. /* return pointer to array of pointers to rows */
  277. return m;
  278. }
  279. float ***f3tensor(long nrl, long nrh, long ncl, long nch, long ndl, long ndh)
  280. /* allocate a float 3tensor with range t[nrl..nrh][ncl..nch][ndl..ndh] */
  281. {
  282. long i,j,nrow=nrh-nrl+1,ncol=nch-ncl+1,ndep=ndh-ndl+1;
  283. float ***t;
  284. /* allocate pointers to pointers to rows */
  285. t=(float ***) malloc((size_t)((nrow+NR_END)*sizeof(float**)));
  286. if (!t) nrerror("allocation failure 1 in f3tensor()");
  287. t += NR_END;
  288. t -= nrl;
  289. /* allocate pointers to rows and set pointers to them */
  290. t[nrl]=(float **) malloc((size_t)((nrow*ncol+NR_END)*sizeof(float*)));
  291. if (!t[nrl]) nrerror("allocation failure 2 in f3tensor()");
  292. t[nrl] += NR_END;
  293. t[nrl] -= ncl;
  294. /* allocate rows and set pointers to them */
  295. t[nrl][ncl]=(float *) malloc((size_t)((nrow*ncol*ndep+NR_END)*sizeof(float)));
  296. if (!t[nrl][ncl]) nrerror("allocation failure 3 in f3tensor()");
  297. t[nrl][ncl] += NR_END;
  298. t[nrl][ncl] -= ndl;
  299. for(j=ncl+1;j<=nch;j++) t[nrl][j]=t[nrl][j-1]+ndep;
  300. for(i=nrl+1;i<=nrh;i++) {
  301. t[i]=t[i-1]+ncol;
  302. t[i][ncl]=t[i-1][ncl]+ncol*ndep;
  303. for(j=ncl+1;j<=nch;j++) t[i][j]=t[i][j-1]+ndep;
  304. }
  305. /* return pointer to array of pointers to rows */
  306. return t;
  307. }
  308. void free_vector(float *v, long nl, long nh)
  309. /* free a float vector allocated with vector() */
  310. {
  311. free((FREE_ARG) (v+nl-NR_END));
  312. }
  313. void free_ivector(int *v, long nl, long nh)
  314. /* free an int vector allocated with ivector() */
  315. {
  316. free((FREE_ARG) (v+nl-NR_END));
  317. }
  318. void free_cvector(unsigned char *v, long nl, long nh)
  319. /* free an unsigned char vector allocated with cvector() */
  320. {
  321. free((FREE_ARG) (v+nl-NR_END));
  322. }
  323. void free_lvector(unsigned long *v, long nl, long nh)
  324. /* free an unsigned long vector allocated with lvector() */
  325. {
  326. free((FREE_ARG) (v+nl-NR_END));
  327. }
  328. void free_dvector(double *v, long nl, long nh)
  329. /* free a double vector allocated with dvector() */
  330. {
  331. free((FREE_ARG) (v+nl-NR_END));
  332. }
  333. void free_matrix(float **m, long nrl, long nrh, long ncl, long nch)
  334. /* free a float matrix allocated by matrix() */
  335. {
  336. free((FREE_ARG) (m[nrl]+ncl-NR_END));
  337. free((FREE_ARG) (m+nrl-NR_END));
  338. }
  339. void free_dmatrix(double **m, long nrl, long nrh, long ncl, long nch)
  340. /* free a double matrix allocated by dmatrix() */
  341. {
  342. free((FREE_ARG) (m[nrl]+ncl-NR_END));
  343. free((FREE_ARG) (m+nrl-NR_END));
  344. }
  345. void free_imatrix(int **m, long nrl, long nrh, long ncl, long nch)
  346. /* free an int matrix allocated by imatrix() */
  347. {
  348. free((FREE_ARG) (m[nrl]+ncl-NR_END));
  349. free((FREE_ARG) (m+nrl-NR_END));
  350. }
  351. void free_submatrix(float **b, long nrl, long nrh, long ncl, long nch)
  352. /* free a submatrix allocated by submatrix() */
  353. {
  354. free((FREE_ARG) (b+nrl-NR_END));
  355. }
  356. void free_convert_matrix(float **b, long nrl, long nrh, long ncl, long nch)
  357. /* free a matrix allocated by convert_matrix() */
  358. {
  359. free((FREE_ARG) (b+nrl-NR_END));
  360. }
  361. void free_f3tensor(float ***t, long nrl, long nrh, long ncl, long nch,
  362. long ndl, long ndh)
  363. /* free a float f3tensor allocated by f3tensor() */
  364. {
  365. free((FREE_ARG) (t[nrl][ncl]+ndl-NR_END));
  366. free((FREE_ARG) (t[nrl]+ncl-NR_END));
  367. free((FREE_ARG) (t+nrl-NR_END));
  368. }
  369. #define NRANSI
  370. #include "nrutil.h"
  371. #define SWAP(a,b) temp=(a);(a)=(b);(b)=temp;
  372. #define M 7
  373. #define NSTACK 50
  374. void sort2(unsigned long n, float arr[], float brr[])
  375. {
  376. unsigned long i,ir=n,j,k,l=1;
  377. int *istack,jstack=0;
  378. float a,b,temp;
  379. istack=ivector(1,NSTACK);
  380. for (;;) {
  381. if (ir-l < M) {
  382. for (j=l+1;j<=ir;j++) {
  383. a=arr[j];
  384. b=brr[j];
  385. for (i=j-1;i>=l;i--) {
  386. if (arr[i] <= a) break;
  387. arr[i+1]=arr[i];
  388. brr[i+1]=brr[i];
  389. }
  390. arr[i+1]=a;
  391. brr[i+1]=b;
  392. }
  393. if (!jstack) {
  394. free_ivector(istack,1,NSTACK);
  395. return;
  396. }
  397. ir=istack[jstack];
  398. l=istack[jstack-1];
  399. jstack -= 2;
  400. } else {
  401. k=(l+ir) >> 1;
  402. SWAP(arr[k],arr[l+1])
  403. SWAP(brr[k],brr[l+1])
  404. if (arr[l] > arr[ir]) {
  405. SWAP(arr[l],arr[ir])
  406. SWAP(brr[l],brr[ir])
  407. }
  408. if (arr[l+1] > arr[ir]) {
  409. SWAP(arr[l+1],arr[ir])
  410. SWAP(brr[l+1],brr[ir])
  411. }
  412. if (arr[l] > arr[l+1]) {
  413. SWAP(arr[l],arr[l+1])
  414. SWAP(brr[l],brr[l+1])
  415. }
  416. i=l+1;
  417. j=ir;
  418. a=arr[l+1];
  419. b=brr[l+1];
  420. for (;;) {
  421. do i++; while (arr[i] < a);
  422. do j--; while (arr[j] > a);
  423. if (j < i) break;
  424. SWAP(arr[i],arr[j])
  425. SWAP(brr[i],brr[j])
  426. }
  427. arr[l+1]=arr[j];
  428. arr[j]=a;
  429. brr[l+1]=brr[j];
  430. brr[j]=b;
  431. jstack += 2;
  432. if (jstack > NSTACK) nrerror("NSTACK too small in sort2.");
  433. if (ir-i+1 >= j-l) {
  434. istack[jstack]=ir;
  435. istack[jstack-1]=i;
  436. ir=j-1;
  437. } else {
  438. istack[jstack]=j-1;
  439. istack[jstack-1]=l;
  440. l=i;
  441. }
  442. }
  443. }
  444. }
  445. #undef M
  446. #undef NSTACK
  447. #undef SWAP
  448. #undef NRANSI
  449. void crank(unsigned long n, float w[], float *s)
  450. {
  451. unsigned long j=1,ji,jt;
  452. float t,rank;
  453. *s=0.0;
  454. while (j < n) {
  455. if (w[j+1] != w[j]) {
  456. w[j]=j;
  457. ++j;
  458. } else {
  459. for (jt=j+1;jt<=n && w[jt]==w[j];jt++);
  460. rank=0.5*(j+jt-1);
  461. for (ji=j;ji<=(jt-1);ji++) w[ji]=rank;
  462. t=jt-j;
  463. *s += t*t*t-t;
  464. j=jt;
  465. }
  466. }
  467. if (j == n) w[n]=n;
  468. }
  469. float erfcc(float x)
  470. {
  471. float t,z,ans;
  472. z=fabs(x);
  473. t=1.0/(1.0+0.5*z);
  474. ans=t*exp(-z*z-1.26551223+t*(1.00002368+t*(0.37409196+t*(0.09678418+
  475. t*(-0.18628806+t*(0.27886807+t*(-1.13520398+t*(1.48851587+
  476. t*(-0.82215223+t*0.17087277)))))))));
  477. return x >= 0.0 ? ans : 2.0-ans;
  478. }
  479. float betai(float a, float b, float x)
  480. {
  481. float betacf(float a, float b, float x);
  482. float gammln(float xx);
  483. void nrerror(char error_text[]);
  484. float bt;
  485. if (x < 0.0 || x > 1.0) nrerror("Bad x in routine betai");
  486. if (x == 0.0 || x == 1.0) bt=0.0;
  487. else
  488. bt=exp(gammln(a+b)-gammln(a)-gammln(b)+a*log(x)+b*log(1.0-x));
  489. if (x < (a+1.0)/(a+b+2.0))
  490. return bt*betacf(a,b,x)/a;
  491. else
  492. return 1.0-bt*betacf(b,a,1.0-x)/b;
  493. }
  494. #define MAXIT 100
  495. #define EPS 3.0e-7
  496. #define FPMIN 1.0e-30
  497. float betacf(float a, float b, float x)
  498. {
  499. void nrerror(char error_text[]);
  500. int m,m2;
  501. float aa,c,d,del,h,qab,qam,qap;
  502. qab=a+b;
  503. qap=a+1.0;
  504. qam=a-1.0;
  505. c=1.0;
  506. d=1.0-qab*x/qap;
  507. if (fabs(d) < FPMIN) d=FPMIN;
  508. d=1.0/d;
  509. h=d;
  510. for (m=1;m<=MAXIT;m++) {
  511. m2=2*m;
  512. aa=m*(b-m)*x/((qam+m2)*(a+m2));
  513. d=1.0+aa*d;
  514. if (fabs(d) < FPMIN) d=FPMIN;
  515. c=1.0+aa/c;
  516. if (fabs(c) < FPMIN) c=FPMIN;
  517. d=1.0/d;
  518. h *= d*c;
  519. aa = -(a+m)*(qab+m)*x/((a+m2)*(qap+m2));
  520. d=1.0+aa*d;
  521. if (fabs(d) < FPMIN) d=FPMIN;
  522. c=1.0+aa/c;
  523. if (fabs(c) < FPMIN) c=FPMIN;
  524. d=1.0/d;
  525. del=d*c;
  526. h *= del;
  527. if (fabs(del-1.0) < EPS) break;
  528. }
  529. if (m > MAXIT) nrerror("a or b too big, or MAXIT too small in betacf");
  530. return h;
  531. }
  532. #undef MAXIT
  533. #undef EPS
  534. #undef FPMIN
  535. //---------------------------------------------------------------------------
  536. #define NRANSI
  537. #include "nrutil.h"
  538. #define SWAP(a,b) temp=(a);(a)=(b);(b)=temp;
  539. #define M 7
  540. #define NSTACK 50
  541. void sort2i(unsigned long n, int arr[], int brr[])
  542. {
  543. unsigned long i,ir=n,j,k,l=1;
  544. int *istack,jstack=0;
  545. int a,b,temp;
  546. istack=ivector(1,NSTACK);
  547. for (;;) {
  548. if (ir-l < M) {
  549. for (j=l+1;j<=ir;j++) {
  550. a=arr[j];
  551. b=brr[j];
  552. for (i=j-1;i>=l;i--) {
  553. if (arr[i] <= a) break;
  554. arr[i+1]=arr[i];
  555. brr[i+1]=brr[i];
  556. }
  557. arr[i+1]=a;
  558. brr[i+1]=b;
  559. }
  560. if (!jstack) {
  561. free_ivector(istack,1,NSTACK);
  562. return;
  563. }
  564. ir=istack[jstack];
  565. l=istack[jstack-1];
  566. jstack -= 2;
  567. } else {
  568. k=(l+ir) >> 1;
  569. SWAP(arr[k],arr[l+1])
  570. SWAP(brr[k],brr[l+1])
  571. if (arr[l] > arr[ir]) {
  572. SWAP(arr[l],arr[ir])
  573. SWAP(brr[l],brr[ir])
  574. }
  575. if (arr[l+1] > arr[ir]) {
  576. SWAP(arr[l+1],arr[ir])
  577. SWAP(brr[l+1],brr[ir])
  578. }
  579. if (arr[l] > arr[l+1]) {
  580. SWAP(arr[l],arr[l+1])
  581. SWAP(brr[l],brr[l+1])
  582. }
  583. i=l+1;
  584. j=ir;
  585. a=arr[l+1];
  586. b=brr[l+1];
  587. for (;;) {
  588. do i++; while (arr[i] < a);
  589. do j--; while (arr[j] > a);
  590. if (j < i) break;
  591. SWAP(arr[i],arr[j])
  592. SWAP(brr[i],brr[j])
  593. }
  594. arr[l+1]=arr[j];
  595. arr[j]=a;
  596. brr[l+1]=brr[j];
  597. brr[j]=b;
  598. jstack += 2;
  599. if (jstack > NSTACK) nrerror("NSTACK too small in sort2.");
  600. if (ir-i+1 >= j-l) {
  601. istack[jstack]=ir;
  602. istack[jstack-1]=i;
  603. ir=j-1;
  604. } else {
  605. istack[jstack]=j-1;
  606. istack[jstack-1]=l;
  607. l=i;
  608. }
  609. }
  610. }
  611. }
  612. #undef M
  613. #undef NSTACK
  614. #undef SWAP
  615. #undef NRANSI
  616. //---------------------------------------------------------------------------
  617. void svdcmp(float **a, int m, int n, float w[], float **v)
  618. {
  619. float pythag(float a, float b);
  620. int flag,i,its,j,jj,k,l,nm;
  621. float anorm,c,f,g,h,s,scale,x,y,z,*rv1;
  622. rv1=vector(1,n);
  623. g=scale=anorm=0.0;
  624. for (i=1;i<=n;i++) {
  625. l=i+1;
  626. rv1[i]=scale*g;
  627. g=s=scale=0.0;
  628. if (i <= m) {
  629. for (k=i;k<=m;k++) scale += fabs(a[k][i]);
  630. if (scale) {
  631. for (k=i;k<=m;k++) {
  632. a[k][i] /= scale;
  633. s += a[k][i]*a[k][i];
  634. }
  635. f=a[i][i];
  636. g = -SIGN(sqrt(s),f);
  637. h=f*g-s;
  638. a[i][i]=f-g;
  639. for (j=l;j<=n;j++) {
  640. for (s=0.0,k=i;k<=m;k++) s += a[k][i]*a[k][j];
  641. f=s/h;
  642. for (k=i;k<=m;k++) a[k][j] += f*a[k][i];
  643. }
  644. for (k=i;k<=m;k++) a[k][i] *= scale;
  645. }
  646. }
  647. w[i]=scale *g;
  648. g=s=scale=0.0;
  649. if (i <= m && i != n) {
  650. for (k=l;k<=n;k++) scale += fabs(a[i][k]);
  651. if (scale) {
  652. for (k=l;k<=n;k++) {
  653. a[i][k] /= scale;
  654. s += a[i][k]*a[i][k];
  655. }
  656. f=a[i][l];
  657. g = -SIGN(sqrt(s),f);
  658. h=f*g-s;
  659. a[i][l]=f-g;
  660. for (k=l;k<=n;k++) rv1[k]=a[i][k]/h;
  661. for (j=l;j<=m;j++) {
  662. for (s=0.0,k=l;k<=n;k++) s += a[j][k]*a[i][k];
  663. for (k=l;k<=n;k++) a[j][k] += s*rv1[k];
  664. }
  665. for (k=l;k<=n;k++) a[i][k] *= scale;
  666. }
  667. }
  668. anorm=FMAX(anorm,(fabs(w[i])+fabs(rv1[i])));
  669. }
  670. for (i=n;i>=1;i--) {
  671. if (i < n) {
  672. if (g) {
  673. for (j=l;j<=n;j++)
  674. v[j][i]=(a[i][j]/a[i][l])/g;
  675. for (j=l;j<=n;j++) {
  676. for (s=0.0,k=l;k<=n;k++) s += a[i][k]*v[k][j];
  677. for (k=l;k<=n;k++) v[k][j] += s*v[k][i];
  678. }
  679. }
  680. for (j=l;j<=n;j++) v[i][j]=v[j][i]=0.0;
  681. }
  682. v[i][i]=1.0;
  683. g=rv1[i];
  684. l=i;
  685. }
  686. for (i=IMIN(m,n);i>=1;i--) {
  687. l=i+1;
  688. g=w[i];
  689. for (j=l;j<=n;j++) a[i][j]=0.0;
  690. if (g) {
  691. g=1.0/g;
  692. for (j=l;j<=n;j++) {
  693. for (s=0.0,k=l;k<=m;k++) s += a[k][i]*a[k][j];
  694. f=(s/a[i][i])*g;
  695. for (k=i;k<=m;k++) a[k][j] += f*a[k][i];
  696. }
  697. for (j=i;j<=m;j++) a[j][i] *= g;
  698. } else for (j=i;j<=m;j++) a[j][i]=0.0;
  699. ++a[i][i];
  700. }
  701. for (k=n;k>=1;k--) {
  702. for (its=1;its<=30;its++) {
  703. flag=1;
  704. for (l=k;l>=1;l--) {
  705. nm=l-1;
  706. if ((float)(fabs(rv1[l])+anorm) == anorm) {
  707. flag=0;
  708. break;
  709. }
  710. if ((float)(fabs(w[nm])+anorm) == anorm) break;
  711. }
  712. if (flag) {
  713. c=0.0;
  714. s=1.0;
  715. for (i=l;i<=k;i++) {
  716. f=s*rv1[i];
  717. rv1[i]=c*rv1[i];
  718. if ((float)(fabs(f)+anorm) == anorm) break;
  719. g=w[i];
  720. h=pythag(f,g);
  721. w[i]=h;
  722. h=1.0/h;
  723. c=g*h;
  724. s = -f*h;
  725. for (j=1;j<=m;j++) {
  726. y=a[j][nm];
  727. z=a[j][i];
  728. a[j][nm]=y*c+z*s;
  729. a[j][i]=z*c-y*s;
  730. }
  731. }
  732. }
  733. z=w[k];
  734. if (l == k) {
  735. if (z < 0.0) {
  736. w[k] = -z;
  737. for (j=1;j<=n;j++) v[j][k] = -v[j][k];
  738. }
  739. break;
  740. }
  741. if (its == 30) nrerror("no convergence in 30 svdcmp iterations");
  742. x=w[l];
  743. nm=k-1;
  744. y=w[nm];
  745. g=rv1[nm];
  746. h=rv1[k];
  747. f=((y-z)*(y+z)+(g-h)*(g+h))/(2.0*h*y);
  748. g=pythag(f,1.0);
  749. f=((x-z)*(x+z)+h*((y/(f+SIGN(g,f)))-h))/x;
  750. c=s=1.0;
  751. for (j=l;j<=nm;j++) {
  752. i=j+1;
  753. g=rv1[i];
  754. y=w[i];
  755. h=s*g;
  756. g=c*g;
  757. z=pythag(f,h);
  758. rv1[j]=z;
  759. c=f/z;
  760. s=h/z;
  761. f=x*c+g*s;
  762. g = g*c-x*s;
  763. h=y*s;
  764. y *= c;
  765. for (jj=1;jj<=n;jj++) {
  766. x=v[jj][j];
  767. z=v[jj][i];
  768. v[jj][j]=x*c+z*s;
  769. v[jj][i]=z*c-x*s;
  770. }
  771. z=pythag(f,h);
  772. w[j]=z;
  773. if (z) {
  774. z=1.0/z;
  775. c=f*z;
  776. s=h*z;
  777. }
  778. f=c*g+s*y;
  779. x=c*y-s*g;
  780. for (jj=1;jj<=m;jj++) {
  781. y=a[jj][j];
  782. z=a[jj][i];
  783. a[jj][j]=y*c+z*s;
  784. a[jj][i]=z*c-y*s;
  785. }
  786. }
  787. rv1[l]=0.0;
  788. rv1[k]=f;
  789. w[k]=x;
  790. }
  791. }
  792. free_vector(rv1,1,n);
  793. }
  794. float pythag(float a, float b)
  795. {
  796. float absa,absb;
  797. absa=fabs(a);
  798. absb=fabs(b);
  799. if (absa > absb) return absa*sqrt(1.0+SQR(absb/absa));
  800. else return (absb == 0.0 ? 0.0 : absb*sqrt(1.0+SQR(absa/absb)));
  801. }
  802. void kendl1(float data1[], float data2[], unsigned long n, float *tau,
  803. float *z, float *prob)
  804. {
  805. float erfcc(float x);
  806. unsigned long n2=0,n1=0,k,j;
  807. long is=0;
  808. float svar,aa,a2,a1;
  809. for (j=1;j<n;j++) {
  810. for (k=(j+1);k<=n;k++) {
  811. a1=data1[j]-data1[k];
  812. a2=data2[j]-data2[k];
  813. aa=a1*a2;
  814. if (aa) {
  815. ++n1;
  816. ++n2;
  817. aa > 0.0 ? ++is : --is;
  818. } else {
  819. if (a1) ++n1;
  820. if (a2) ++n2;
  821. }
  822. }
  823. }
  824. *tau=is/(sqrt((double) n1)*sqrt((double) n2));
  825. svar=(4.0*n+10.0)/(9.0*n*(n-1.0));
  826. *z=(*tau)/sqrt(svar);
  827. *prob=erfcc(fabs(*z)/1.4142136);
  828. }