📄 h_k arithmetic.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 + -