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

📄 recipes.cpp

📁 著名的基因芯片表达数据聚类软件。esein编写
💻 CPP
📖 第 1 页 / 共 3 页
字号:
					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

#define NRANSI
#define SWAP(a,b) temp=(a);(a)=(b);(b)=temp;#define M 7#define NSTACK 50

void sort3fff(unsigned long n, float arr[], float brr[], float crr[])
{	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

#include <math.h>
#define TINY 1.0e-20void 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

float betai(float a, float b, float x)
{	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;}

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);}

#define MAXIT 100
#define EPS 3.0e-7#define FPMIN 1.0e-30float 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
//---------------------------------------------------------------------------
#include <math.h>
#define NRANSI
#include "nrutil.h"

void spear(float data1[], float data2[], unsigned long n, float *d, float *zd,
	float *probd, float *rs, float *probrs)
{
	float betai(float a, float b, float x);
	void crank(unsigned long n, float w[], float *s);
	float erfcc(float x);
	void sort2(unsigned long n, float arr[], float brr[]);
	unsigned long j;
	float vard,t,sg,sf,fac,en3n,en,df,aved,*wksp1,*wksp2;

	wksp1=vector(1,n);
	wksp2=vector(1,n);
	for (j=1;j<=n;j++) {
		wksp1[j]=data1[j];
		wksp2[j]=data2[j];
	}
	sort2(n,wksp1,wksp2);
	crank(n,wksp1,&sf);
	sort2(n,wksp2,wksp1);
	crank(n,wksp2,&sg);
	*d=0.0;
	for (j=1;j<=n;j++)
		*d += SQR(wksp1[j]-wksp2[j]);
	en=n;
	en3n=en*en*en-en;
	aved=en3n/6.0-(sf+sg)/12.0;
	fac=(1.0-sf/en3n)*(1.0-sg/en3n);
	vard=((en-1.0)*en*en*SQR(en+1.0)/36.0)*fac;
	*zd=(*d-aved)/sqrt(vard);
	*probd=erfcc(fabs(*zd)/1.4142136);
	*rs=(1.0-(6.0/en3n)*(*d+(sf+sg)/12.0))/sqrt(fac);
	fac=(*rs+1.0)*(1.0-(*rs));
	if (fac > 0.0) {
		t=(*rs)*sqrt((en-2.0)/fac);
		df=en-2.0;
		*probrs=betai(0.5*df,0.5,df/(df+t*t));
	} else
		*probrs=0.0;
	free_vector(wksp2,1,n);
	free_vector(wksp1,1,n);
}
#undef NRANSI
#include <math.h>

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);
}

#define NR_END 1
#define FREE_ARG char*

void nrerror(char error_text[])
/* Numerical Recipes standard error handler */
{
	fprintf(stderr,"Numerical Recipes run-time error...\n");
	fprintf(stderr,"%s\n",error_text);
	fprintf(stderr,"...now exiting to system...\n");
	exit(1);
}

float *vector(long nl, long nh)
/* allocate a float vector with subscript range v[nl..nh] */
{
	float *v;

	v=(float *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(float)));
	if (!v) nrerror("allocation failure in vector()");
	return v-nl+NR_END;
}

int *ivector(long nl, long nh)
/* allocate an int vector with subscript range v[nl..nh] */
{
	int *v;

	v=(int *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(int)));
	if (!v) nrerror("allocation failure in ivector()");
	return v-nl+NR_END;
}

unsigned char *cvector(long nl, long nh)
/* allocate an unsigned char vector with subscript range v[nl..nh] */
{
	unsigned char *v;

	v=(unsigned char *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(unsigned char)));
	if (!v) nrerror("allocation failure in cvector()");
	return v-nl+NR_END;
}

unsigned long *lvector(long nl, long nh)
/* allocate an unsigned long vector with subscript range v[nl..nh] */
{
	unsigned long *v;

	v=(unsigned long *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(long)));
	if (!v) nrerror("allocation failure in lvector()");
	return v-nl+NR_END;
}

double *dvector(long nl, long nh)
/* allocate a double vector with subscript range v[nl..nh] */
{
	double *v;

	v=(double *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(double)));
	if (!v) nrerror("allocation failure in dvector()");
	return v-nl+NR_END;
}

float **matrix(long nrl, long nrh, long ncl, long nch)
/* allocate a float matrix with subscript range m[nrl..nrh][ncl..nch] */
{
	long i, nrow=nrh-nrl+1,ncol=nch-ncl+1;
	float **m;

	/* allocate pointers to rows */
	m=(float **) malloc((size_t)((nrow+NR_END)*sizeof(float*)));
	if (!m) nrerror("allocation failure 1 in matrix()");
	m += NR_END;
	m -= nrl;

	/* allocate rows and set pointers to them */
	m[nrl]=(float *) malloc((size_t)((nrow*ncol+NR_END)*sizeof(float)));
	if (!m[nrl]) nrerror("allocation failure 2 in matrix()");
	m[nrl] += NR_END;
	m[nrl] -= ncl;

	for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol;

	/* return pointer to array of pointers to rows */
	return m;
}

double **dmatrix(long nrl, long nrh, long ncl, long nch)
/* allocate a double matrix with subscript range m[nrl..nrh][ncl..nch] */
{
	long i, nrow=nrh-nrl+1,ncol=nch-ncl+1;
	double **m;

	/* allocate pointers to rows */
	m=(double **) malloc((size_t)((nrow+NR_END)*sizeof(double*)));
	if (!m) nrerror("allocation failure 1 in matrix()");
	m += NR_END;
	m -= nrl;

	/* allocate rows and set pointers to them */
	m[nrl]=(double *) malloc((size_t)((nrow*ncol+NR_END)*sizeof(double)));
	if (!m[nrl]) nrerror("allocation failure 2 in matrix()");
	m[nrl] += NR_END;
	m[nrl] -= ncl;

	for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol;

	/* return pointer to array of pointers to rows */
	return m;
}

int **imatrix(long nrl, long nrh, long ncl, long nch)
/* allocate a int matrix with subscript range m[nrl..nrh][ncl..nch] */
{
	long i, nrow=nrh-nrl+1,ncol=nch-ncl+1;
	int **m;

	/* allocate pointers to rows */
	m=(int **) malloc((size_t)((nrow+NR_END)*sizeof(int*)));
	if (!m) nrerror("allocation failure 1 in matrix()");
	m += NR_END;
	m -= nrl;


	/* allocate rows and set pointers to them */
	m[nrl]=(int *) malloc((size_t)((nrow*ncol+NR_END)*sizeof(int)));
	if (!m[nrl]) nrerror("allocation failure 2 in matrix()");
	m[nrl] += NR_END;
	m[nrl] -= ncl;

	for(i=nrl+1;i<=nrh;i++) m[i]=m[i-1]+ncol;

	/* return pointer to array of pointers to rows */
	return m;
}

float **submatrix(float **a, long oldrl, long oldrh, long oldcl, long oldch,
	long newrl, long newcl)
/* point a submatrix [newrl..][newcl..] to a[oldrl..oldrh][oldcl..oldch] */
{
	long i,j,nrow=oldrh-oldrl+1,ncol=oldcl-newcl;
	float **m;

	/* allocate array of pointers to rows */
	m=(float **) malloc((size_t) ((nrow+NR_END)*sizeof(float*)));
	if (!m) nrerror("allocation failure in submatrix()");
	m += NR_END;
	m -= newrl;

	/* set pointers to rows */
	for(i=oldrl,j=newrl;i<=oldrh;i++,j++) m[j]=a[i]+ncol;

	/* return pointer to array of pointers to rows */
	return m;
}

float **convert_matrix(float *a, long nrl, long nrh, long ncl, long nch)
/* allocate a float matrix m[nrl..nrh][ncl..nch] that points to the matrix
declared in the standard C manner as a[nrow][ncol], where nrow=nrh-nrl+1
and ncol=nch-ncl+1. The routine should be called with the address
&a[0][0] as the first argument. */
{
	long i,j,nrow=nrh-nrl+1,ncol=nch-ncl+1;
	float **m;

	/* allocate pointers to rows */
	m=(float **) malloc((size_t) ((nrow+NR_END)*sizeof(float*)));
	if (!m) nrerror("allocation failure in convert_matrix()");
	m += NR_END;
	m -= nrl;

	/* set pointers to rows */
	m[nrl]=a-ncl;
	for(i=1,j=nrl+1;i<nrow;i++,j++) m[j]=m[j-1]+ncol;
	/* return pointer to array of pointers to rows */
	return m;
}

float ***f3tensor(long nrl, long nrh, long ncl, long nch, long ndl, long ndh)
/* allocate a float 3tensor with range t[nrl..nrh][ncl..nch][ndl..ndh] */
{
	long i,j,nrow=nrh-nrl+1,ncol=nch-ncl+1,ndep=ndh-ndl+1;
	float ***t;

	/* allocate pointers to pointers to rows */
	t=(float ***) malloc((size_t)((nrow+NR_END)*sizeof(float**)));
	if (!t) nrerror("allocation failure 1 in f3tensor()");
	t += NR_END;
	t -= nrl;

	/* allocate pointers to rows and set pointers to them */
	t[nrl]=(float **) malloc((size_t)((nrow*ncol+NR_END)*sizeof(float*)));
	if (!t[nrl]) nrerror("allocation failure 2 in f3tensor()");
	t[nrl] += NR_END;
	t[nrl] -= ncl;

	/* allocate rows and set pointers to them */
	t[nrl][ncl]=(float *) malloc((size_t)((nrow*ncol*ndep+NR_END)*sizeof(float)));
	if (!t[nrl][ncl]) nrerror("allocation failure 3 in f3tensor()");
	t[nrl][ncl] += NR_END;
	t[nrl][ncl] -= ndl;

	for(j=ncl+1;j<=nch;j++) t[nrl][j]=t[nrl][j-1]+ndep;
	for(i=nrl+1;i<=nrh;i++) {
		t[i]=t[i-1]+ncol;
		t[i][ncl]=t[i-1][ncl]+ncol*ndep;
		for(j=ncl+1;j<=nch;j++) t[i][j]=t[i][j-1]+ndep;
	}

	/* return pointer to array of pointers to rows */
	return t;
}

void free_vector(float *v, long nl, long nh)
/* free a float vector allocated with vector() */
{
	free((FREE_ARG) (v+nl-NR_END));
}

⌨️ 快捷键说明

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