#include "stdio.h"
#include <string.h>
#include <conio.h>
#define M 10
#define n 10
#define REALMAX 9.9e37f
void wave_read(float x[n][M],char *filename,int d)
{
int i,j;
FILE *fp;
if((fp=fopen(filename,"rb"))==0)
printf("\nSorry filename [%d]......\n",d);
for(i=0;i<n;i++)
for(j=0;j<M;j++)
{
fscanf(fp,"%e",&x[i][j]);
}
fclose(fp);
}
float zmin(float a,float b, float c) /*求D3,D4,D5的最小值*/
{
float aa;
aa=REALMAX;
if(aa==b&&aa==c&&aa==a) return 8.8e37f;
if(a>b) return b>c?c:b;
else return a>=c?c:a;
if(a==b) return a<=c?a:c;
}
void main()
{
struct datafilename {
float data;
char chstr[M][20];
};
float t[n][M];
float r[n][M];
static struct datafilename strdata[M+1];
int d,i,j,k,f,g;
float dist[M+1];
float sum1,aa,D3,D4,D5; float D1[n][n];
float D2[n][n];
char filename_test[2][20]={
{"c:\\ww.txt"},{"c:\\ee.txt"}
}; /*2个测试模板*/
char filename_ref[11][20]={ {0},
{"c:\\q1.txt"},{"c:\\q2.txt" },
{"c:\\q5.txt"},{"c:\\q4.txt" },
{"c:\\q3.txt"},{"c:\\q6.txt" },
{"c:\\q7.txt"},{"c:\\q8.txt" },
{"c:\\q9.txt"},{"c:\\q10.txt"}
}; /*10个参考模板*/
putchar('\n');
for(i=0;i<M;i++)
{
strdata[i].data=0.0;
strcpy(strdata[i].chstr[i],filename_ref[i+1]);
}
putchar('\n');
for(k=0;k<=M;k++) /*定义数组dist[M]使其都为0*/
dist[k]=0.0;
for(i=0;i<n;i++)
for(k=0;k<M;k++)
{
t[i][k]=0.0;
r[i][k]=0.0;
}
for(i=0;i<n;i++)
for(k=0;k<n;k++)
{
D1[i][k]=0.0;
D2[i][k]=REALMAX;
}
for(f=0;f<2;f++)
{
wave_read(t,filename_test[f],f); /*读测试模板的参数*/
printf(
"\nThe min diference of eath files and "
"%s is .....\n\n",
filename_test[f]);
for(d=1;d<=M;d++)
{
wave_read(r,filename_ref[d],d); /*读参考模板的参数*/
for (i=0;i<n;i++)
{
for (j=0;j<n;j++)
{
float x,y;
sum1=0.0;
for(g=0;g<M;g++)
{
x=t[i][g];
y=r[j][g];
sum1+=(x-y)*(x-y);
}
D1[i][j]=sum1; /* 匹配距离距阵D1[n][n]*/
}
}
D2[0][0]=D1[0][0];
for(i=1;i<n;i++)
for(j=0;j<n;j++)
{
D3=D2[i-1][j];
if(j>0)
D4=D2[i-1][j-1];
else
D4=REALMAX;
if(j>1)
D5=D2[i-1][j-2];
else
D5=REALMAX;
D2[i][j]=D1[i][j]+zmin(D3,D4,D5);
}
strdata[d].data=D2[i-1][j-1];
printf("dist[%2d] = %10e\t\t\t",d,strdata[d].data);
}
printf("\n");
aa=strdata[1].data;
g=0;
for(k=1;k<=10;k++)
{
if(aa>strdata[k].data)
{
aa=strdata[k].data;
g=k;
}
}
strdata[g].data=aa;
printf("\nThe result is");
printf(
"\n\nThe %s and %s is min and its v alue "
"dist[%d] is %e\n\n\n\n\n\n\n\n",
filename_test[f],
strdata[g-1].chstr[g-1],
g,
strdata[g].data); /*f是测试模板的个数,i是距离最少所对应的文件,
dist[i]是所对应的最小距离*/
}
}