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

📄 h_k arithmetic.cpp

📁 模式识别学习程序。此程序是模式识别中应用的H_K算法源程序。对学习模式识别很有用。
💻 CPP
字号:
#include <iostream.h>
#include <iomanip.h>
#include <math.h>
#define TIME 3
#define DIM  10
struct node
{
int name;
double carray[10];
int number;
node *next;
};

node *createlist(node *,int,int,int);
void printlist(node *,int);


node* createlist(node* head,int limit,int nub,int multiply)
{
	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<limit;i++)
		{
		 temp->carray[i]=cinarray[i]*multiply;
		}
		temp->carray[limit]=multiply;
		temp->name=nub;
		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+1;j++)
	{
	cout<<setw(4)<<temp->carray[j];
	}  
   temp=temp->next;
	cout<<endl;
  }
}

void main()
{
	int i,k,j,n;
    int dim;
	int count;
   	double d=0;
	int l=0;
    double t=0;
    int again=0;
    int eps=1;

   
node *head1=NULL,*head2=NULL,*head3=NULL;
cout<<"输入模式的维数"<<endl;
cin>>dim;
double x[10][10],y[10][10],c[10][10],f[10][10],m[10][10],zero[10],middle[10],status[10];
 for(i=0;i<10;i++)
 {
    for(j=0;j<10;j++)
	{
	   x[i][j]=0;
	   y[i][j]=0;
	   c[i][j]=0;
	   f[i][j]=0;
	   m[i][j]=0;
	}
	zero[i]=0;
    middle[i]=0;
	status[i]=0;
 }

cout<<"输入属于第一个类的模式"<<endl;
head1=createlist(head1,dim,1,1);
cout<<"输入属于第二个类的模式"<<endl;
head2=createlist(head2,dim,2,-1);
node *fore;
fore=head1;
cout<<"所输入的全部模式为"<<endl;
printlist(head1,dim);
printlist(head2,dim);
i=0;
node *compare1=head1;
node *compare2=head2;
 while(compare1!=NULL)
 {
	 for(j=0;j<dim+1;j++)
	 {
      x[i][j]=compare1->carray[j];
	 }
	 compare1=compare1->next;
	 i++;
 }
  while(compare2!=NULL)
  {
	 for(j=0;j<dim+1;j++)
	 {
      x[i][j]=compare2->carray[j];
	 }
	 compare2=compare2->next;
	 i++;
  }
  count=i;
  cout<<"共包含模式数"<<count<<endl;
   for(i=0;i<10;i++)
   {
    for(j=0;j<10;j++)
	{
   	  y[j][i]=x[i][j];
	} 
   }
   for(i=0;i<10;i++)
   {
    for(k=0;k<10;k++)
	{
     for(j=0;j<10;j++)
	 {
	   c[i][k]+=y[i][j]*x[j][k];
	 }
    }
   }
   /*C=XX'
  for(i=0;i<10;i++)
  {
    for(j=0;j<10;j++)
	{
	cout<<setw(6)<<c[i][j];
	}
	cout<<endl;
  }
  */
  ///the inverse matrix
  double course[DIM][2*DIM];
  for(i=0;i<DIM;i++)
  {
    for(j=0;j<2*DIM;j++)
	{
	   if(j<DIM)
	   {
	     course[i][j]=c[i][j];
	   }
	   else if(j==i+DIM)
	   {
		   if(i<dim+1)
		   {
			 course[i][j]=1;
		   }
		   else
		   {
		     course[i][j]=0;   
		   }
	   }
	   else
	   {
	    course[i][j]=0;
	   }
	}
  }
for(k=0;k<dim+1;k++)
{ 
   
   d=course[k][k];
   l=k;
   for(i=k+1;i<dim+1;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+1;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; 
	  }
  }
}
//print the inverse matrix
cout<<"逆矩阵为"<<endl;
for(i=0;i<DIM;i++)
 {
    for(j=DIM;j<2*DIM;j++)
	{ 
	  f[i][j-DIM]=course[i][j];
	 // cout<<setw(6)<<course[i][j];
	}
//	cout<<endl;
 }

   for(i=0;i<10;i++)
   {
    for(k=0;k<10;k++)
	{
     for(j=0;j<10;j++)
	 {
	   m[i][k]+=f[i][j]*y[j][k];
	 }
    }
   }
   /*
   cout<<"伪逆为"<<endl;

  for(i=0;i<10;i++)
  {
    for(j=0;j<10;j++)
	{
	cout<<setw(6)<<m[i][j];
	}
	cout<<endl;
  }
  */
  double b[10],w[10],e[10];
  for(i=0;i<10;i++)
  {
   if(i<count)
   {
    b[i]=1;
   }
   else
   {
    b[i]=0;
   }
  }
  for(i=0;i<10;i++)
  {
     w[i]=0;
	 e[i]=0;
  }

while(true)
{
	for(i=0;i<10;i++)
	{
      for(j=0;j<10;j++)
	  {
	    w[i]+=m[i][j]*b[j];
	  }
	}

  for(i=0;i<10;i++)
  {
    for(j=0;j<10;j++)
	{
	  e[i]+=x[i][j]*w[j];
	}
	e[i]=e[i]-b[i];
  }
  //判断部分
	int flag1=0,flag3=0;
	for(n=0;n<count;n++)
	{
	  if(e[n]==zero[n])
	  {
	     flag1++;
	  }
	  else if(e[n]<zero[n])
	  {
	   flag3++;
	   status[n]++;
	  }	
	  else
	  {
	   status[n]=0;
	  }
	}
	if(flag1==count)
	{
	    goto lab;
	}
	else if(flag3==count)
	{
       goto lab;
	}
    for(i=0;i<10;i++)
	{
	  if(status[i]>TIME)
	  {
	    goto lab;
	  }
	}
   for(i=0;i<10;i++)
   {
    middle[i]=0;
   }
   for(i=0;i<10;i++)
   {
	for(j=0;j<10;j++)
	{
     middle[i]+=m[i][j]*fabs(e[j]);
	}
	 w[i]=w[i]+middle[i];
   }
   for(i=0;i<10;i++)
   {
  b[i]=b[i]+(e[i]+fabs(e[i]));
   }
} 
lab:
  cout<<"W 的权值为"<<endl;
  for(i=0;i<count;i++)
  {
    cout<<setw(6)<<w[i];
  }
}

/*
输入模式的维数
2
输入属于第一个类的模式
0 0 1
0 1 1
0 0 -1
输入完成
输入属于第二个类的模式
1 0 1
1 1 1
0 0 -1
输入完成
所输入的全部模式为
   0   0   1
   0   1   1
  -1   0  -1

  -1  -1  -1
共包含模式数4
逆矩阵为
W 的权值为
    -2     0     1     0Press any key to continue
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -