📄 miutils.c
字号:
for (d=0;d<dimx+dimy;d++) xc[d]=x[d][ind[i]]; neiK(x,dimx+dimy,0,dimx,ind[i],BOX,epsilon,K,box,lis,nn); epsx=0; for (d=0;d<dimx;d++) for(k=1;k<=K;k++) if( (dx=fabs(xc[d]-x[d][nn[k]]))>epsx ) epsx=dx; epsy=0; for (d=dimx;d<dimx+dimy;d++) for(k=1;k<=K;k++) if( (dy=fabs(xc[d]-x[d][nn[k]]))>epsy ) epsy=dy; if (dimx>1) nx2=neiE(xx,indx[i],0,dimx-1,dimx,BOX,epsilon,epsx,boxx,lisx); else nx2=neiE1(x[0],ind[i],scalx,BOX1,epsx,boxx1,lisx1,mxi); if (dimy>1) ny2=neiE(yy,indy[i],0,dimy-1,dimy,BOX,epsilon,epsy,boxy,lisy); else ny2=neiE1(x[dimx],ind[i],scaly,BOX1,epsy,boxy1,lisy1,myi); if (epsx>epsy) { Eps=epsx;nx1=nx2; if (dimy>1) ny1=neiE(yy,indy[i],0,dimy-1,dimy,BOX,epsilon,Eps,boxy,lisy); else ny1=neiE1(x[dimx],ind[i],scaly,BOX1,Eps,boxy1,lisy1,myi); dxy1+=psi[nx1]+psi[ny1+1]; } else { Eps=epsy;ny1=ny2; if (dimx>1) nx1=neiE(xx,indx[i],0,dimx-1,dimx,BOX,epsilon,Eps,boxx,lisx); else nx1=neiE1(x[0],ind[i],scalx,BOX1,Eps,boxx1,lisx1,mxi); dxy1+=psi[nx1+1]+psi[ny1]; } dxy2+=psi[nx2]+psi[ny2]; } dxy1/=N;*mic=psi[N]+psi[K]-dxy1; dxy2/=N;*mir=psi[N]+phi[K]-dxy2; free(xc);free(nn);free(lis); for (i=0;i<BOX;i++) free(box[i]); free(box); free(ind);free(indx);free(indy); if (dimx==1) {free(mxi);free(boxx1);free(lisx1);} else { for (i=0;i<BOX;i++) free(boxx[i]); free(boxx); free(lisx); for (d=0;d<dimx;d++) free(xx[d]); free(xx); } if (dimy==1) {free(myi);free(boxy1);free(lisy1);} else { for (i=0;i<BOX;i++) free(boxy[i]); free(boxy); free(lisy); for (d=0;d<dimy;d++) free(yy[d]); free(yy); } free(phi);}void mic_xnyn(double **x, int dimx, int dimy, int N, int K, double *psi, double *scal, double *mic) { int i,k,nx1,ny1; double *xc,dy,dx; double epsx,epsy,Eps; double dxy1; double **xx,**yy;; double scalx, scaly; int *nn; int d; int BOX,BOX1; int **box,**boxy,**boxx,*lis; // two dimensional boxes int *lisy,*lisx; // lists for two dimensions int *boxx1, *boxy1; // onedimensional boxes int *lisy1,*lisx1; // lists for one dimensions int *mxi, *myi; //accumulative lists of points in oned boxes int *ind,*indx,*indy; //indeces of original data (the data resorted during box creating) double epsilon; int inveps; nn=(int*)calloc(K+1,sizeof(int)); xc=(double*)calloc(dimx+dimy,sizeof(double)); BOX=1; while (0.5*BOX*BOX*K<N) BOX*=2; epsilon=4.0/BOX; inveps=BOX/4; BOX1=N-5; if (dimx>1) { xx=(double**)calloc(dimx,sizeof(double*)); for (d=0;d<dimx;d++) xx[d]=(double*)calloc(N,sizeof(double)); boxx=(int**)calloc(BOX,sizeof(int*)); for (i=0;i<BOX;i++) boxx[i]=(int*)calloc(BOX,sizeof(int)); lisx=(int*)calloc(N,sizeof(int)); } else { boxx1=(int*)calloc(BOX1+1,sizeof(int)); lisx1=(int*)calloc(N,sizeof(int)); mxi=(int*)calloc(BOX1+1,sizeof(int)); } if (dimy>1) { yy=(double**)calloc(dimy,sizeof(double*)); for (d=0;d<dimy;d++) yy[d]=(double*)calloc(N,sizeof(double)); boxy=(int**)calloc(BOX,sizeof(int*)); for (i=0;i<BOX;i++) boxy[i]=(int*)calloc(BOX,sizeof(int)); lisy=(int*)calloc(N,sizeof(int)); } else { boxy1=(int*)calloc(BOX1+1,sizeof(int)); lisy1=(int*)calloc(N,sizeof(int)); myi=(int*)calloc(BOX1+1,sizeof(int)); } box=(int**)calloc(BOX,sizeof(int*)); for (i=0;i<BOX;i++) box[i]=(int*)calloc(BOX,sizeof(int)); lis=(int*)calloc(N,sizeof(int)); ind=(int*)calloc(N,sizeof(int)); indx=(int*)calloc(N,sizeof(int)); indy=(int*)calloc(N,sizeof(int)); //save x if it would be reordered if (dimx>1) for (d=0;d<dimx;d++) memcpy(xx[d],x[d],N*sizeof(double)); if (dimy>1) for (d=0;d<dimy;d++) memcpy(yy[d],x[d+dimx],N*sizeof(double)); make_box2ind(x,dimx+dimy,N,0,dimx,BOX,inveps,ind,box,lis); //for searching neighbours in product space if (dimx==1) {scalx=scal[0]; make_box1(x[0],N,scalx,BOX1,boxx1,lisx1,mxi);} else make_box2ind(xx,dimx,N,0,dimx-1,BOX,inveps,indx,boxx,lisx); if (dimy==1) {scaly=scal[dimx]; make_box1(x[dimx],N,scaly,BOX1,boxy1,lisy1,myi); } else make_box2ind(yy,dimy,N,0,dimy-1,BOX,inveps,indy,boxy,lisy); dxy1=0.0; for (i=0;i<N;i++) { for (d=0;d<dimx+dimy;d++) xc[d]=x[d][ind[i]]; neiK(x,dimx+dimy,0,dimx,ind[i],BOX,epsilon,K,box,lis,nn); epsx=0; for (d=0;d<dimx;d++) for(k=1;k<=K;k++) if( (dx=fabs(xc[d]-x[d][nn[k]]))>epsx ) epsx=dx; epsy=0; for (d=dimx;d<dimx+dimy;d++) for(k=1;k<=K;k++) if( (dy=fabs(xc[d]-x[d][nn[k]]))>epsy ) epsy=dy; if (epsx>epsy) { Eps=epsx;} else {Eps=epsy;} if (dimy>1) ny1=neiE(yy,indy[i],0,dimy-1,dimy,BOX,epsilon,Eps,boxy,lisy); else ny1=neiE1(x[dimx],ind[i],scaly,BOX1,Eps,boxy1,lisy1,myi); if (dimx>1) nx1=neiE(xx,indx[i],0,dimx-1,dimx,BOX,epsilon,Eps,boxx,lisx); else nx1=neiE1(x[0],ind[i],scalx,BOX1,Eps,boxx1,lisx1,mxi); if (epsx>epsy) { dxy1+=psi[nx1]+psi[ny1+1]; } else { dxy1+=psi[nx1+1]+psi[ny1]; } } dxy1/=N;*mic=psi[N]+psi[K]-dxy1; free(xc);free(nn);free(lis); for (i=0;i<BOX;i++) free(box[i]); free(box); free(ind);free(indx);free(indy); if (dimx==1) {free(mxi);free(boxx1);free(lisx1);} else { for (i=0;i<BOX;i++) free(boxx[i]); free(boxx); free(lisx); for (d=0;d<dimx;d++) free(xx[d]); free(xx); } if (dimy==1) {free(myi);free(boxy1);free(lisy1);} else { for (i=0;i<BOX;i++) free(boxy[i]); free(boxy); free(lisy); for (d=0;d<dimy;d++) free(yy[d]); free(yy); }}void mir_xnyn(double **x, int dimx, int dimy, int N, int K, double *psi, double *scal, double *mir) { int i,k,nx2,ny2; double *xc,dy,dx; double epsx,epsy; double dxy2; double **xx,**yy;; double scalx, scaly; int *nn; int d; int BOX,BOX1; int **box,**boxy,**boxx,*lis; // two dimensional boxes int *lisy,*lisx; // lists for two dimensions int *boxx1, *boxy1; // onedimensional boxes int *lisy1,*lisx1; // lists for one dimensions int *mxi, *myi; //accumulative lists of points in oned boxes int *ind,*indx,*indy; //indeces of original data (the data resorted during box creating) double epsilon; int inveps; double *phi; phi=(double*)calloc(K+1,sizeof(double)); for (i=1;i<=K;i++) phi[i]=psi[i]-1/(double(i)); // nn=(int*)calloc(K+1,sizeof(int)); xc=(double*)calloc(dimx+dimy,sizeof(double)); BOX=1; while (0.5*BOX*BOX*K<N) BOX*=2; epsilon=4.0/BOX; inveps=BOX/4; BOX1=N-5; if (dimx>1) { xx=(double**)calloc(dimx,sizeof(double*)); for (d=0;d<dimx;d++) xx[d]=(double*)calloc(N,sizeof(double)); boxx=(int**)calloc(BOX,sizeof(int*)); for (i=0;i<BOX;i++) boxx[i]=(int*)calloc(BOX,sizeof(int)); lisx=(int*)calloc(N,sizeof(int)); } else { boxx1=(int*)calloc(BOX1+1,sizeof(int)); lisx1=(int*)calloc(N,sizeof(int)); mxi=(int*)calloc(BOX1+1,sizeof(int)); } if (dimy>1) { yy=(double**)calloc(dimy,sizeof(double*)); for (d=0;d<dimy;d++) yy[d]=(double*)calloc(N,sizeof(double)); boxy=(int**)calloc(BOX,sizeof(int*)); for (i=0;i<BOX;i++) boxy[i]=(int*)calloc(BOX,sizeof(int)); lisy=(int*)calloc(N,sizeof(int)); } else { boxy1=(int*)calloc(BOX1+1,sizeof(int)); lisy1=(int*)calloc(N,sizeof(int)); myi=(int*)calloc(BOX1+1,sizeof(int)); } box=(int**)calloc(BOX,sizeof(int*)); for (i=0;i<BOX;i++) box[i]=(int*)calloc(BOX,sizeof(int)); lis=(int*)calloc(N,sizeof(int)); ind=(int*)calloc(N,sizeof(int)); indx=(int*)calloc(N,sizeof(int)); indy=(int*)calloc(N,sizeof(int)); //save x if it would be reordered if (dimx>1) for (d=0;d<dimx;d++) memcpy(xx[d],x[d],N*sizeof(double)); if (dimy>1) for (d=0;d<dimy;d++) memcpy(yy[d],x[d+dimx],N*sizeof(double)); make_box2ind(x,dimx+dimy,N,0,dimx,BOX,inveps,ind,box,lis); //for searching neighbours in product space if (dimx==1) {scalx=scal[0]; make_box1(x[0],N,scalx,BOX1,boxx1,lisx1,mxi);} else make_box2ind(xx,dimx,N,0,dimx-1,BOX,inveps,indx,boxx,lisx); if (dimy==1) {scaly=scal[dimx]; make_box1(x[dimx],N,scaly,BOX1,boxy1,lisy1,myi); } else make_box2ind(yy,dimy,N,0,dimy-1,BOX,inveps,indy,boxy,lisy); dxy2=0.0; for (i=0;i<N;i++) { for (d=0;d<dimx+dimy;d++) xc[d]=x[d][ind[i]]; neiK(x,dimx+dimy,0,dimx,ind[i],BOX,epsilon,K,box,lis,nn); epsx=0; for (d=0;d<dimx;d++) for(k=1;k<=K;k++) if( (dx=fabs(xc[d]-x[d][nn[k]]))>epsx ) epsx=dx; epsy=0; for (d=dimx;d<dimx+dimy;d++) for(k=1;k<=K;k++) if( (dy=fabs(xc[d]-x[d][nn[k]]))>epsy ) epsy=dy; if (dimx>1) nx2=neiE(xx,indx[i],0,dimx-1,dimx,BOX,epsilon,epsx,boxx,lisx); else nx2=neiE1(x[0],ind[i],scalx,BOX1,epsx,boxx1,lisx1,mxi); if (dimy>1) ny2=neiE(yy,indy[i],0,dimy-1,dimy,BOX,epsilon,epsy,boxy,lisy); else ny2=neiE1(x[dimx],ind[i],scaly,BOX1,epsy,boxy1,lisy1,myi); dxy2+=psi[nx2]+psi[ny2]; } dxy2/=N;*mir=psi[N]+phi[K]-dxy2; free(xc);free(nn);free(lis); for (i=0;i<BOX;i++) free(box[i]); free(box); free(ind);free(indx);free(indy); if (dimx==1) {free(mxi);free(boxx1);free(lisx1);} else { for (i=0;i<BOX;i++) free(boxx[i]); free(boxx); free(lisx); for (d=0;d<dimx;d++) free(xx[d]); free(xx); } if (dimy==1) {free(myi);free(boxy1);free(lisy1);} else { for (i=0;i<BOX;i++) free(boxy[i]); free(boxy); free(lisy); for (d=0;d<dimy;d++) free(yy[d]); free(yy); } free(phi);}void redK(double **x, int dim, int N, int K, double *psi, double *scal, double *mi_cr) { int i,k,ik,**n1,**n2; double *xc,dx; double **eps,*Eps; int *maxdim; double *dxy1,*dxy2; int *nn; int d; int BOX,BOX1; int **box,*lis; // two dimensional boxes int **box1; // onedimensional boxes int **lis1; // lists for one dimensions int **mxi; //accumulative lists of points in oned boxes double epsilon; int inveps; double *phi; phi=(double*)calloc(K+1,sizeof(double)); for (i=1;i<=K;i++) phi[i]=psi[i]-(dim-1)/(double(i)); // nn=(int*)calloc(K+1,sizeof(int)); xc=(double*)calloc(dim+1,sizeof(double)); BOX=1; while (0.5*BOX*BOX*K<N) BOX*=2; epsilon=4.0/BOX; inveps=BOX/4; BOX1=N-5; box1=(int**)calloc(dim,sizeof(int*)); lis1=(int**)calloc(dim,sizeof(int*)); mxi=(int**)calloc(dim,sizeof(int*)); for (d=0;d<dim;d++) { box1[d]=(int*)calloc(BOX1+1,sizeof(int)); lis1[d]=(int*)calloc(N,sizeof(int)); mxi[d]=(int*)calloc(BOX1+1,sizeof(int)); } box=(int**)calloc(BOX,sizeof(int*)); for (i=0;i<BOX;i++) box[i]=(int*)calloc(BOX,sizeof(int)); lis=(int*)calloc(N,sizeof(int)); eps=(double**)calloc(K,sizeof(double*)); Eps=(double*)calloc(K,sizeof(double)); n1=(int**)calloc(K,sizeof(int*)); n2=(int**)calloc(K,sizeof(int*)); maxdim=(int*)calloc(K,sizeof(int)); for (ik=0;ik<K;ik++) { eps[ik]=(double*)calloc(dim,sizeof(double)); n1[ik]=(int*)calloc(dim,sizeof(int)); n2[ik]=(int*)calloc(dim,sizeof(int)); mi_cr[ik*2]=0; mi_cr[ik*2+1]=0; } dxy1=(double*)calloc(K,sizeof(double)); dxy2=(double*)calloc(K,sizeof(double)); make_box2(x,dim,N,0,dim-1,BOX,inveps,box,lis); //for searching neighbours in prodict space for (d=0;d<dim;d++) make_box1(x[d],N,scal[d],BOX1,box1[d],lis1[d],mxi[d]); for (ik=0;ik<K;ik++) {dxy1[ik]=dxy2[ik]=0.0;} for (i=0;i<N;i++) { for (d=0;d<dim;d++) xc[d]=x[d][i]; neiK(x,dim,0,dim-1,i,BOX,epsilon,K,box,lis,nn); for (ik=0;ik<K;ik++) { Eps[ik]=0;maxdim[ik]=-1; for (d=0;d<dim;d++) { eps[ik][d]=0; for(k=1;k<=ik+1;k++) {if( (dx=fabs(xc[d]-x[d][nn[k]]))>eps[ik][d] ) eps[ik][d]=dx; } if (eps[ik][d]>Eps[ik]) {Eps[ik]=eps[ik][d];maxdim[ik]=d;} } } for (ik=0;ik<K;ik++) { for (d=0;d<dim;d++) { n2[ik][d]=neiE1(x[d],i,scal[d],BOX1,eps[ik][d],box1[d],lis1[d],mxi[d]); if (d==maxdim[ik]) { n1[ik][d]=n2[ik][d]; dxy1[ik]+=psi[n1[ik][d]]; } else { n1[ik][d]=neiE1(x[d],i,scal[d],BOX1,Eps[ik],box1[d],lis1[d],mxi[d]); dxy1[ik]+=psi[n1[ik][d]+1]; } dxy2[ik]+=psi[n2[ik][d]]; } } } for (ik=0;ik<K;ik++) { dxy1[ik]/=N;mi_cr[ik*2]=(dim-1)*psi[N]+psi[ik+1]-dxy1[ik]; dxy2[ik]/=N;mi_cr[ik*2+1]=(dim-1)*psi[N]+phi[ik+1]-dxy2[ik]; } free(xc);free(nn); for (i=0;i<BOX;i++) free(box[i]); free(box); free(lis); for (d=0;d<dim;d++) { free(box1[d]);free(lis1[d]);free(mxi[d]); } free(box1);free(lis1);free(mxi); for (ik=0;ik<K;ik++) { free(eps[ik]); free(n1[ik]); free(n2[ik]); } free(eps);free(n1);free(n2); free(Eps);free(maxdim); free(dxy1); free(dxy2); free(phi);}void mi2K(double **x, int N, int K, double *psi, double *scal, double *mi_cr) { int i,k,ik,**n1,**n2; double *xc,dx; double **eps,*Eps; int *maxdim; double *dxy1,*dxy2; int *nn; int d; int BOX,BOX1; int **box,*lis; // two dimensional boxes int **box1; // onedimensional boxes int **lis1; // lists for one dimensions int **mxi; //accumulative lists of points in oned boxes double epsilon; int inveps; int dim=2; double *phi; phi=(double*)calloc(K+1,sizeof(double)); for (i=1;i<=K;i++) phi[i]=psi[i]-(dim-1)/(double(i)); // nn=(int*)calloc(K+1,sizeof(int)); xc=(double*)calloc(dim+1,sizeof(double)); BOX=1; while (0.5*BOX*BOX*K<N) BOX*=2; epsilon=4.0/BOX; inveps=BOX/4; BOX1=N-5; box1=(int**)calloc(dim,sizeof(int*)); lis1=(int**)calloc(dim,sizeof(int*)); mxi=(int**)calloc(dim,sizeof(int*)); for (d=0;d<dim;d++) { box1[d]=(int*)calloc(BOX1+1,sizeof(int)); lis1[d]=(int*)calloc(N,sizeof(int)); mxi[d]=(int*)calloc(BOX1+1,sizeof(int)); } box=(int**)calloc(BOX,sizeof(int*)); for (i=0;i<BOX;i++) box[i]=(int*)calloc(BOX,sizeof(int)); lis=(int*)calloc(N,sizeof(int)); eps=(double**)calloc(K,sizeof(double*)); Eps=(double*)calloc(K,sizeof(double)); n1=(int**)calloc(K,sizeof(int*)); n2=(int**)calloc(K,sizeof(int*)); maxdim=(int*)calloc(K,sizeof(int)); for (ik=0;ik<K;ik++) { eps[ik]=(double*)calloc(dim,sizeof(double)); n1[ik]=(int*)calloc(dim,sizeof(int)); n2[ik]=(int*)calloc(dim,sizeof(int)); mi_cr[ik*2]=0; mi_cr[ik*2+1]=0; } dxy1=(double*)calloc(K,sizeof(double)); dxy2=(double*)calloc(K,sizeof(double)); make_box2(x,dim,N,0,1,BOX,inveps,box,lis); //for searching neighbours in prodict space for (d=0;d<dim;d++) make_box1(x[d],N,scal[d],BOX1,box1[d],lis1[d],mxi[d]); for (ik=0;ik<K;ik++) {dxy1[ik]=dxy2[ik]=0.0;} for (i=0;i<N;i++) { for (d=0;d<dim;d++) xc[d]=x[d][i]; neiK(x,dim,0,dim-1,i,BOX,epsilon,K,box,lis,nn); for (ik=0;ik<K;ik++) { Eps[ik]=0;maxdim[ik]=-1; for (d=0;d<dim;d++) { eps[ik][d]=0; for(k=1;k<=ik+1;k++) {if( (dx=fabs(xc[d]-x[d][nn[k]]))>eps[ik][d] ) eps[ik][d]=dx; } if (eps[ik][d]>Eps[ik]) {Eps[ik]=eps[ik][d];maxdim[ik]=d;} } } for (ik=0;ik<K;ik++) { for (d=0;d<dim;d++) { n2[ik][d]=neiE1(x[d],i,scal[d],BOX1,eps[ik][d],box1[d],lis1[d],mxi[d]); if (d==maxdim[ik]) { n1[ik][d]=n2[ik][d]; dxy1[ik]+=psi[n1[ik][d]]; } else { n1[ik][d]=neiE1(x[d],i,scal[d],BOX1,Eps[ik],box1[d],lis1[d],mxi[d]); dxy1[ik]+=psi[n1[ik][d]+1]; } dxy2[ik]+=psi[n2[ik][d]]; } } } for (ik=0;ik<K;ik++) { dxy1[ik]/=N;mi_cr[ik*2]=psi[N]+psi[ik+1]-dxy1[ik]; dxy2[ik]/=N;mi_cr[ik*2+1]=psi[N]+phi[ik+1]-dxy2[ik]; } free(xc);free(nn); for (i=0;i<BOX;i++) free(box[i]); free(box); free(lis); for (d=0;d<dim;d++) { free(box1[d]);free(lis1[d]);free(mxi[d]); } free(box1);free(lis1);free(mxi); for (ik=0;ik<K;ik++) { free(eps[ik]); free(n1[ik]); free(n2[ik]); } free(eps);free(n1);free(n2); free(Eps);free(maxdim); free(dxy1); free(dxy2); free(phi);}void mi_xnynK(double **x, int dimx, int dimy, int N, int K, double *psi, double *scal, double *mi_cr) { int i,ik,k,*nx1,*ny1,*nx2,*ny2; double *xc,dy,dx; double *epsx,*epsy,*Eps; double *dxy1,*dxy2; double **xx,**yy;; double scalx, scaly; int *nn; int d; int BOX,BOX1; int **box,**boxy,**boxx,*lis; // two dimensional boxes int *lisy,*lisx; // lists for two dimensions int *boxx1, *boxy1; // onedimensional boxes int *lisy1,*lisx1; // lists for one dimensions int *mxi, *myi; //accumulative lists of points in oned boxes int *ind,*indx,*indy; //indeces of original data (the data resorted during box creating) double epsilon; int inveps; double *phi; phi=(double*)calloc(K+1,sizeof(double)); for (i=1;i<=K;i++) phi[i]=psi[i]-1/(double(i)); // nn=(int*)calloc(K+1,sizeof(int)); xc=(double*)calloc(dimx+dimy,sizeof(double)); dxy1=(double*)calloc(K,sizeof(double)); dxy2=(double*)calloc(K,sizeof(double)); nx1=(int*)calloc(K,sizeof(int)); nx2=(int*)calloc(K,sizeof(int)); ny1=(int*)calloc(K,sizeof(int)); ny2=(int*)calloc(K,sizeof(int)); epsx=(double*)calloc(K,sizeof(double)); epsy=(double*)calloc(K,sizeof(double));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -