#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <time.h>
#define INPUT 1024
#define NUM 40
#define K 40
#define WENJIANSHU 840
#define YINZI 4./INPUT
#define gaosi(x,y,z) exp(-1.*((double)(x)-(double)(y))*((double)(x)-(double)(y))/((double)(z)*(double)(z)))
/* 分配空间子函数 */
double* dmatrix1(int N)
{
double *u;
u = (double *) malloc(sizeof(double) * N);
return u;
}
double** dmatrix2(int M,int N)
{
int i;
double **u;
u = (double **) malloc(sizeof(double *) * M);
for(i=0;i<M;i++) u[i] = dmatrix1(N);
return u;
}
/* 读数据子函数 */
void data_read(char *str,double *x,int Nl)
{
FILE *infile;
int k;
infile=fopen(str,"r");
if(!infile)
{
fprintf(stderr,"File Not Found: %s\n",str);
exit(1);
}
for(k=0; k<Nl; k++)
{
fscanf(infile,"%lf",&x[k]);//这样用一维数组对二维赋值!!
}
fclose(infile);
}
void save_weight(char *file,double **x,int Nr,int Nl)
{
FILE *fp;
int i,j;
fp=fopen(file,"w");
for(i=0;i<Nr;i++)
{
{
for(j=0;j<Nl;j++)
fprintf(fp,"%f ",x[i][j]);
}
fprintf(fp,"\n\n");}
fclose(fp);
}
int main(int argc, char* argv[])
{
double **p1,**out1,**m,**b,**w,**u;
double *s,*out,*max;
double ss=0.0,zj=0.0;
double coe;
char fname1[100],fname2[100],fname3[100],fname4[100],fname5[100];
int aa=0,sbbj[WENJIANSHU],flag[INPUT],nn[WENJIANSHU];
int i,j,k,q;
FILE *fp;
//Memory Allocation
p1=dmatrix2(WENJIANSHU,INPUT);
m=dmatrix2(INPUT,K);
b=dmatrix2(INPUT,K);
w=dmatrix2(NUM,K);
u=dmatrix2(INPUT,K);
out1=dmatrix2(NUM,WENJIANSHU);
s=dmatrix1(K);
out=dmatrix1(NUM);
max=dmatrix1(WENJIANSHU);
//读入一个大文件,p1是210*1024维
strcpy(fname1,"F:\\tezheng\\test\\clean40ci.txt");
fp=fopen(fname1,"r");
for(j=0;j<INPUT;j++)
for(i=0;i<WENJIANSHU;i++)
{
fscanf(fp,"%lf ",&p1[i][j]);
}
fclose(fp);//这里应注意原来特征文件是怎样存放的.不是按文件存放的,而是按特征存放的
//测试
// fp=fopen("F:\\tezheng\\ceshi\\p1.txt","w");
//save_weight("F:\\tezheng\\ceshi\\p1.txt",p1,WENJIANSHU,INPUT);
// fclose(fp);
//用flag数组把不必要的输入省去
//strcpy(fname2,"F:\\tezheng\\shengqubiaozhi.txt");
//fp=fopen(fname2,"r");
//for(i=0;i<1024;i++)
//{
// fscanf(fp,"%d",flag[i]);//
//}
//fclose(fp);
//k=0;
//for(i=0;i<1024;i++)
// {if(flag[i]==1025)
// for(q=0;q<WENJIANSHU;q++)
// for(j=0;j<INPUT-1-i;j++)
// p1[q][i-k+j]=p1[q][i-k+j+1];
// k++;
//}
//读入中心值
strcpy(fname3,"F:\\tezheng\\weight4\\clean40ci\\Cluster.txt");
fp=fopen(fname3,"r");
for(i=0;i<INPUT;i++)
for(j=0;j<K;j++)
{
fscanf(fp,"%lf ",&m[i][j]);
}
fclose(fp);
//测试
//save_weight("F:\\tezheng\\ceshi\\m.txt",m,INPUT,K);
//fclose(fp);
//读入宽度值
strcpy(fname4,"F:\\tezheng\\weight4\\clean40ci\\sg.txt");
fp=fopen(fname4,"r");
for(i=0;i<INPUT;i++)
for(j=0;j<K;j++)
{
fscanf(fp,"%lf ",&b[i][j]);
}
fclose(fp);
//测试
// save_weight("F:\\tezheng\\weight4\\clean30ci\\b.txt",b,INPUT,K);
//读入权值
strcpy(fname5,"F:\\tezheng\\weight4\\clean40ci\\W.txt");
fp=fopen(fname5,"r");
for(i=0;i<NUM;i++)
for(j=0;j<K;j++)
{
fscanf(fp,"%lf ",&w[i][j]);
}
fclose(fp);
//测试
//save_weight("F:\\tezheng\\ceshi\\w.txt",w,NUM,K);
//fclose(fp);
for(q=0;q<WENJIANSHU;q++)
{
//隶属度(模糊化)层
for(i=0;i<INPUT;i++)
{
for(j=0;j<K;j++)
{
u[i][j]=gaosi(p1[q][i],m[i][j],b[i][j]);
if(u[i][j]==0)
u[i][j]=pow(10,-200);
}
}
//测试
//save_weight("F:\\tezheng\\ceshi\\u.txt",u,INPUT,K);
//fclose(fp);
//推理层
for(j=0;j<K;j++)
{
s[j]=1.0;
for(i=0;i<INPUT;i++)
{
zj=pow(u[i][j],YINZI);
s[j]=s[j]*zj;
}
}
//测试
//fp=fopen("F:\\tezheng\\ceshi\\s.txt","w");
//for(i=0;i<K;i++)
//fprintf(fp,"%d ",s[i]);
//fclose(fp);
ss=0.0;
for(i=0;i<K;i++)
ss+=s[i];
//函数输出(解模糊)层
for(i=0;i<NUM;i++)
{
out[i]=0.0;
for(j=0;j<K;j++)
{
out[i]+=w[i][j]*s[j];
}
out[i]=out[i]/ss;
out1[i][q]=out[i];//NUM*WENJIANSHU
}
//测试
//save_weight("F:\\tezheng\\ceshi\\out1.txt",out1,NUM,WENJIANSHU);
//fclose(fp);
}
//识别
fp=fopen("40ci.txt","r");
for(i=0;i<WENJIANSHU;i++)
{
fscanf(fp,"%d ",&sbbj[i]);
}
fclose(fp);
//测试
//fp=fopen("F:\\tezheng\\ceshi\\sbbj.txt","w");
//for(i=0;i<WENJIANSHU;i++)
// fprintf(fp,"%d ",sbbj[i]);
//fclose(fp);
//求out1列的最大值的位置(即10个词中哪个的输出最大)
for(q=0;q<WENJIANSHU;q++)
{max[q]=out1[0][q];
nn[q]=1;
for(k=1;k<NUM;k++)
if(out1[k][q]>max[q])
{max[q]=out1[k][q];
nn[q]=k+1;}
printf("%d ",nn[q]);
}//k为列中取得最大值的位置,即那个词识别正确了。
//测试
//fp=fopen("F:\\tezheng\\ceshi\\nn.txt","w");
//for(i=0;i<WENJIANSHU;i++)
// fprintf(fp,"%d ",nn[i]);
//fclose(fp);
printf("\n识别的词:\n");
for(q=0;q<WENJIANSHU;q++)
if(nn[q]==sbbj[q])
{aa++;
printf("%d ",nn[q]);}
coe=(double)aa/(double)WENJIANSHU;
printf("\n");
printf("%lf\n",coe);
return 0;
}
评论0