📄 fisher1.cpp
字号:
#include <iostream.h>
#include <iomanip.h>
#include <math.h>
#define DIM 10
struct node
{
double carray[10];
int number;
node *next;
};
node *createlist(node *,int);
void printlist(node *,int);
node* createlist(node* head,int limit)
{
node *temp,*tail;
double cinarray[10];
for(int i=0;i<limit+1;i++)
{
cin>>cinarray[i];
}
while(cinarray[limit]>=0)
{
temp=new node;
for(i=0;i<10;i++)
{
if(i<limit)
{
temp->carray[i]=cinarray[i];
}
else
{
temp->carray[i]=0;
}
}
temp->number=1;
temp->next=NULL;
if(head==NULL)
{
head=temp;
tail=temp;
}
else
{
tail->next=temp;
tail=temp;
}
for(i=0;i<limit+1;i++)
{
cin>>cinarray[i];
}
}
cout<<"输入完成"<<endl;
return(head);
}
void printlist(node *head,int limit)
{
node *temp=head;
while(temp!=NULL)
{
for(int j=0;j<limit;j++)
{
cout<<setw(4)<<temp->carray[j];
}
temp=temp->next;
cout<<endl;
}
}
void main()
{
int dim;
int i,j,k;
double realmatrix1[10][10],realmatrix2[10];
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
{
realmatrix1[i][j]=0;
}
realmatrix2[i]=0;
}
node *head1=NULL,*head2=NULL,*head3=NULL;
cout<<"输入模式的维数,但不能超过10维"<<endl;
cin>>dim;
cout<<"请输入第一个类的模式组"<<endl;
head1=createlist(head1,dim);
cout<<"请输入第二个类的模式组"<<endl;
head2=createlist(head2,dim);
cout<<"请你所输入第一个类的模式组为"<<endl;
printlist(head1,dim);
cout<<"请你所输入第二个类的模式组为"<<endl;
printlist(head2,dim);
node *compare1,*compare2;
compare1=head1;
compare2=head2;
node mean1,mean2;
for(i=0;i<10;i++)
{
mean1.carray[i]=0;
mean2.carray[i]=0;
}
int count1=0,count2=0;
while(compare1!=NULL)
{
count1++;
for(j=0;j<10;j++)
{
if(j<dim)
{
mean1.carray[j]+=compare1->carray[j];
}
}
compare1=compare1->next;
}
for(i=0;i<10;i++)
{
mean1.carray[i]=mean1.carray[i]/count1;
}
while(compare2!=NULL)
{
count2++;
for(j=0;j<10;j++)
{
if(j<dim)
{
mean2.carray[j]+=compare2->carray[j];
}
}
compare2=compare2->next;
}
for(i=0;i<10;i++)
{
mean2.carray[i]=mean2.carray[i]/count2;
}
node *find1,*find2;
find1=head1;
find2=head2;
while(find1!=0)
{
for(i=0;i<dim;i++)
{
for(j=0;j<10;j++)
{
realmatrix1[i][j]+=(find1->carray[i]-mean1.carray[i])*(find1->carray[j]-mean1.carray[j]);
}
}
find1=find1->next;
}
while(find2!=0)
{
for(i=0;i<dim;i++)
{
for(j=0;j<10;j++)
{
realmatrix1[i][j]+=(find2->carray[i]-mean2.carray[i])*(find2->carray[j]-mean2.carray[j]);
}
}
find2=find2->next;
}
cout<<"总离散矩阵为"<<endl;
for(i=0;i<dim;i++)
{
for(j=0;j<dim;j++)
{
cout<<setw(4)<<realmatrix1[i][j];
}
cout<<endl;
}
double course[DIM][2*DIM];
for(i=0;i<DIM;i++)
{
for(j=0;j<2*DIM;j++)
{
if(j<DIM)
{
course[i][j]=realmatrix1[i][j];
}
else if(j==i+DIM)
{
course[i][j]=1;
}
else
{
course[i][j]=0;
}
}
}
double d=0;
int l=0;
double t=0;
for(k=0;k<dim;k++)
{
d=course[k][k];
l=k;
for(i=k+1;i<dim;i++)
{
if(fabs(course[i][k])>fabs(d))
{
d=course[i][k];
l=i;
}
}
if(d==0)
{
cout<<"该矩阵为非奇异矩阵"<<endl;
goto lab;
}
else if(l!=k)
{
for(j=0;j<2*DIM;j++)
{
t=course[l][j];
course[l][j]=course[k][j];
course[k][j]=t;
}
}
for(j=k+1;j<2*DIM;j++)
{
course[k][j]=course[k][j]/course[k][k];
}
course[k][k]=1;
for(i=0;i<dim;i++)
{
if(i!=k)
{
for(j=k+1;j<2*DIM;j++)
{
course[i][j]=course[i][j]-course[i][k]*course[k][j];
}
course[i][k]=0;
}
}
}
lab:
cout<<"逆矩阵为"<<endl;
for(i=0;i<DIM;i++)
{
for(j=0;j<DIM;j++)
{
cout<<setw(4)<<course[i][j];
}
cout<<endl;
}
for(i=0;i<DIM;i++)
{
for(j=DIM;j<2*DIM;j++)
{
cout<<setw(4)<<course[i][j];
}
cout<<endl;
}
cout<<"请输入你要判断的模式,维数要相同"<<endl;
head3=createlist(head3,dim);
cout<<"请你所输入的模式组为"<<endl;
printlist(head3,dim);
node *end;
end=head3;
int count3=0;
double sum=0;
node mean,meanminus;
for(i=0;i<10;i++)
{
if(i<dim)
{
mean.carray[i]=(mean1.carray[i]+mean2.carray[i])/2;
meanminus.carray[i]=mean1.carray[i]-mean2.carray[i];
}
else
{
mean.carray[i]=0;
meanminus.carray[i]=0;
}
}
for(i=0;i<dim;i++)
{
for(j=0;j<dim;j++)
{
realmatrix2[i]+=meanminus.carray[j]*course[i][j];
}
}
while(end!=NULL)
{
for(i=0;i<dim;i++)
{
sum+=realmatrix2[i]*(end->carray[i]-mean.carray[i]);
}
if(sum>=0)
{
cout<<"第"<<count3<<"个输入的模式为第 1 类"<<endl;
}
else
{
cout<<"第"<<count3<<"个输入的模式为第 2 类"<<endl;
}
sum=0;
count3++;
end=end->next;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -