加入kendall进入计算

#include
#include
//kendall相关系数 
//传入两个数组,以及数组元素个数,计算这两个数组元素的Kendall相关性
double kendall(double X[],double Y[],int line)
{

    /*
        int **edge;
        edge=(int **)malloc(G->vexnum*sizeof(int *));
        for(int i=0; ivexnum; i++)
        {
            edge[i]=(int *)malloc(G->vexnum*sizeof(int));
        }
        */
    double info1[line];
    int info2[line];
    double info3[line];
    int info4[line];
    for(int i=0; i)
    {
        info1[i]=0.0;
        info2[i]=0;
        info3[i]=0.0;
        info4[i]=0;
    }
    int k=0;
    for(int j=0; j)
    {
        int judge=0;
        if(k>0)
        {
            for(int m=0; m)
            {
                if( Y[j]==info1[m])
                {
                    judge=1;
                }
            }
        }
        if(judge==0)
        {
            info1[k]=Y[j];
            int n=1;
            for(int m=j+1; m)
            {
                if(Y[m]==Y[j])
                    n++;;
            }
            info2[k]=n;
            k++;
        }
    }
    int k2=0;
    for(int j=0; j)
    {
        int judge=0;
        if(k2>0)
        {
            for(int m=0; m)
            {
                if( X[j]==info3[m])
                {
                    judge=1;
                }
            }
        }

        if(judge==0)
        {
            info3[k2]=X[j];
            int n=1;
            for(int m=j+1; m)
            {
                if(X[m]==X[j])
                    n++;;
            }
            info4[k2]=n;
            k2++;
        }
    }
    int C=0,D=0;
    double N1=0.0,N2=0.0;
    for(int i=0; i)
    {
        if(i<k)
        {
            N2+=0.5*info2[i]*(info2[i]-1);
        }
        if(i<k2)
        {
            N1+=0.5*info4[i]*(info4[i]-1);
        }
        for(int j=i+1; j)
        {
            if((X[i]>X[j]&&Y[i]>Y[j])||(X[i]Y[j]))
                C++;
            else if((X[i]>X[j]&&Y[i]Y[j]))
                D++;
        }
    }
    double N3=line*(line-1)/2.0;
    double kendall=((C-D)*1.0)/sqrt((N3-N1)*(N3-N2));//eb和rb
    return kendall;
}


//对rate和ec和degree进行排序
//str传入需要排序的文件,line传入文件行数即节点数
 void sortByRate(char* str,int line){
     FILE* fp;
    
     float ex;//用于rate和ec的比较
     int ex1;//用于degree的比较
     int temp;
    int a;
    float b;
    float c;
    int d;
    int i=0;
    int j=0;
    int p=0;
    //用于排序的degeree,ec,rate
    int degree[2000];
    float ec[2000];
    int kcore[2000];
    float rate[2000];
    
    //记录节点真实的degeree,ec,rate
    int degree1[2000];
    float ec1[2000];
    int kcore1[2000];
    float rate1[2000];
//记录节点变化
    int dflag[2000];
    int eflag[2000];
    int kflag[2000];
    int rflag[2000];

    fp=fopen(str,"r");
    char buf[1024];
    char StrLine[1024];
    if((fp=fopen(str,"r"))==NULL)
    {
    perror("faile to read");
    exit(1);
    }
int max=0;
while(!feof(fp))//因为行数等于边数,则读取行数个就可以把其他的节点的连接读完
    {

fgets(StrLine,1024,fp);
sscanf(StrLine,"%d%f%d%f",&a,&b,&d,&c);

     degree[i]=a;
     ec[i]=b;
     rate[i]=c;
     kcore[i]=d;

     degree1[i]=a;
     ec1[i]=b;
     kcore1[i]=d;
     rate1[i]=c;
    
    i++;
    
    
    }


//对感染率排序
    for( p=0;p)
    {
    rflag[p]=p;
    }
     for(i=0;i){
         for( j=0;j1;j++){
             if(rate[j]1]){
                temp=rflag[j];
                rflag[j]=rflag[j+1];
                rflag[j+1]=temp;
                 
                ex=rate[j];
                rate[j]=rate[j+1];
                rate[j+1]=ex;
                 }
            
        
                                    }
                             }
//对度排序
for( p=0;p)
    {
    dflag[p]=p;
    
    }
     for(i=0;i){
         for( j=0;j1;j++){
             if(degree[j]1]){
                temp=dflag[j];
                dflag[j]=dflag[j+1];
                dflag[j+1]=temp;
                 
                ex1=degree[j];
                degree[j]=degree[j+1];
                degree[j+1]=ex1;
                 }
            
        
                                    }
                             }
//对kcore进行排序
 for( p=0;p)
    {
    kflag[p]=p;
    
    }
     for(i=0;i){
         for( j=0;j1;j++){
             if(kcore[j]1]){
                temp=kflag[j];
                kflag[j]=kflag[j+1];
                kflag[j+1]=temp;
                 
                ex1=kcore[j];
                kcore[j]=kcore[j+1];
                kcore[j+1]=ex1;
                 }
            
        
                                    }
                             }
//对特征向量中心性排序
for( p=0;p)
    {
    eflag[p]=p;
    }
     for(i=0;i){
         for( j=0;j1;j++){
             if(ec[j]1]){
                temp=eflag[j];
                eflag[j]=eflag[j+1];
                eflag[j+1]=temp;
                 
                ex=ec[j];
                ec[j]=ec[j+1];
                ec[j+1]=ex;
                 }
            
        
                                    }
                             }
    /*
    //比较数值所属节点从大往小排
    for(int k=0;k*/
    //计算kendall(进行比较的参数,进行比较的参数,个数)
    double q=kendall(degree1,rate1,2000);
    printf("%f ",q); 
    //计算相关性
    //节点比例依次从0.05到0.2(i=比例*2000)
    FILE* fp2;
    char* str2="E:\\data_set\\relative.txt";//写入结果的文件 
    fp2=fopen(str2,"w");
     for(int nodeNum=10;nodeNum<=400;nodeNum=nodeNum+10){
    float i;
    i=nodeNum/2000.0;//nodeNum占总个数的比例 
    int k=0;
    float x1=0;
    float x2=0;
    float num1=0;
    float num2=0;
    float num3=0;
    //按照度 
     for( k=0;k)
    {
    x1+=ec1[dflag[k]];
    }
    for( k=0;k)
    {
    x2+=ec[k];
    }
    num1=1.0-(x1/x2);
    //printf("degree is: %f \n",1.0-(x1/x2));
    

    //按照ec 
     for( k=0;k)
    {
    x1+=ec1[eflag[k]];
    }
    for( k=0;k)
    {
    x2+=ec[k];
    }
    num2=1.0-(x1/x2);
    //printf("the ec is: %f \n",1.0-(x1/x2));
      
      //按照kcore 
     for( k=0;k)
    {
    x1+=ec1[kflag[k]];
    }
    for( k=0;k)
    {
    x2+=ec[k];
    }
    num3=1.0-(x1/x2);
    
    
    fprintf(fp2,"%.3f        %f        %f         %f\n",i,num1,num2,num3);
    
    
    
}
 } 


int main(){
    
    char* str="E:\\data_set\\result2b.txt";//传入的文件必须没有空格 
    
    
    sortByRate( str,2000);
    
    return 0;
}

 

#include#include//kendall相关系数 //传入两个数组,以及数组元素个数,计算这两个数组元素的Kendall相关性double kendall(double X[],double Y[],int line){
    /*        int **edge;        edge=(int **)malloc(G->vexnum*sizeof(int *));        for(int i=0; ivexnum; i++)        {            edge[i]=(int *)malloc(G->vexnum*sizeof(int));        }        */    double info1[line];    int info2[line];    double info3[line];    int info4[line];    for(int i=0; i0)        {            for(int m=0; m0)        {            for(int m=0; m        if(judge==0)        {            info3[k2]=X[j];            int n=1;            for(int m=j+1; mX[j]&&Y[i]>Y[j])||(X[i]X[j]&&Y[i]Y[j]))                D++;        }    }    double N3=line*(line-1)/2.0;    double kendall=((C-D)*1.0)/sqrt((N3-N1)*(N3-N2));//eb和rb    return kendall;}

//对rate和ec和degree进行排序//str传入需要排序的文件,line传入文件行数即节点数 void sortByRate(char* str,int line){     FILE* fp;         float ex;//用于rate和ec的比较     int ex1;//用于degree的比较     int temp;    int a;    float b;    float c;    int d;    int i=0;    int j=0;    int p=0;    //用于排序的degeree,ec,rate    int degree[2000];    float ec[2000];    int kcore[2000];    float rate[2000];        //记录节点真实的degeree,ec,rate    int degree1[2000];    float ec1[2000];    int kcore1[2000];    float rate1[2000];//记录节点变化    int dflag[2000];    int eflag[2000];    int kflag[2000];    int rflag[2000];
    fp=fopen(str,"r");    char buf[1024];    char StrLine[1024];    if((fp=fopen(str,"r"))==NULL)    {    perror("faile to read");    exit(1);    }int max=0;while(!feof(fp))//因为行数等于边数,则读取行数个就可以把其他的节点的连接读完    {
fgets(StrLine,1024,fp);sscanf(StrLine,"%d%f%d%f",&a,&b,&d,&c);
     degree[i]=a;     ec[i]=b;     rate[i]=c;     kcore[i]=d;
     degree1[i]=a;     ec1[i]=b;     kcore1[i]=d;     rate1[i]=c;        i++;            }

//对感染率排序    for( p=0;p    //按照ec      for( k=0;k
int main(){    char* str="E:\\data_set\\result2b.txt";//传入的文件必须没有空格         sortByRate( str,2000);    return 0;}

你可能感兴趣的:(加入kendall进入计算)