⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fisher1.cpp

📁 模式识别中应用fisher原则进行分类的算法程序。对学习模式识别很有用。
💻 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 + -