📄 fish.cpp
字号:
#include <iostream.h>
#include <math.h>
#include <stdlib.h>
#define NUM 8 //8维向量,每一维代表一路传感器的数据
#define cnum 2 //2类
#define N1 60 //w1类模式个数(100A)
#define N2 60 //w2类模式个数(50A)
unsigned char data[10][4][8][8][60]={
{
#include "样本//rmb00.txt"
},
{
#include "样本//rmb01.txt"
},
{
#include "样本//rmb02.txt"
},
{
#include "样本//rmb03.txt"
},
{
#include "样本//rmb04.txt"
},
{
#include "样本//rmb05.txt"
},
{
#include "样本//rmb06.txt"
},
{
#include "样本//rmb07.txt"
},
{
#include "样本//rmb08.txt"
},
{
#include "样本//rmb09.txt"
}
};
void PrintV(double x[N1][NUM])
{
int i,j;
for(i=0;i<N1;i++)
{
cout<<endl;
for(j=0;j<NUM;j++)
cout<<x[i][j]<<" ";
}
}
void Getmj(double mj[NUM],double x[N1][NUM])
{
int i,j;
double d=0.0;
for(i=0;i<NUM;i++)
{
d=0.0;
for(j=0;j<N1;j++)
d+=x[j][i];
if(N1!=0)
mj[i]=d/N1;
}
}
void Printmj(double mj[NUM])
{
int i;
for(i=0;i<NUM;i++)
cout<<mj[i]<<" ";
cout<<endl;
}
void PrintSW(double sw[NUM][NUM])
{
int i,j;
cout<<endl;
for(i=0;i<NUM;i++)
{
for(j=0;j<NUM;j++)
cout<<sw[i][j]<<" ";
cout<<endl;
}
cout<<endl;
}
void PrintY(double Y[N1])
{
int i;
for(i=0;i<N1;i++)
{
if(!(i%8)&&i>7)
cout<<endl;
cout<<Y[i]<<" ";
}
cout<<endl;
}
void GetSWi(double sw1[NUM][NUM],double x[N1][NUM])
{
double m[NUM];
int i,j,k;
double d=0.0;
Getmj(m,x);
for(j=0;j<NUM;j++)
for(k=0;k<NUM;k++)
{
d=0.0;
for(i=0;i<N1;i++)
d+=(x[i][j]-m[j])*(x[i][k]-m[k]);
sw1[j][k]=d/N1;
}
}
void GetSW(double sw[NUM][NUM],double sw1[NUM][NUM],double sw2[NUM][NUM])
{
int i,j;
for(i=0;i<NUM;i++)
for(j=0;j<NUM;j++)
sw[i][j]=sw1[i][j]+sw2[i][j];
}
//****************************************************************************
//void SelectMain选主元
////求逆矩阵 void GetVi
//****************************************************************************
///选主元
void SelectMain(double A[NUM][2*NUM],int k)//choose main
{
//共n行,m列,选第K列主元
int n=NUM;
int m=2*NUM;
double d=0.0;//main
double t;
int l;//主元所在行
int i,j;
for(i=k;i<=n;i++)
{
if(fabs(A[i][k])>d)
{
d=A[i][k];
l=i;
}
}
if(d=0)
{
cerr<<"该矩阵为奇异矩阵!"<<endl;
exit(1);
}
else if(l!=k)//交换行
{
for(j=k;j<=m;j++)
{
t=A[l][j];
A[l][j]=A[k][j];
A[k][j]=t;
}
}
}
double I[NUM][NUM];//8*8单位矩阵
double H[NUM][2*NUM];
//求逆矩阵
void GetVi(double Vi[NUM][NUM],double V[NUM][NUM])
{
int i,j,r;
for( i=0;i<NUM;i++)
for( j=0;j<NUM;j++)
{
I[i][j]=(i==j?1:0);
}
for( i=0;i<NUM;i++)
for( j=0;j<2*NUM;j++)
{
if(j>NUM-1)
H[i][j]=I[i][j-NUM];
else
H[i][j]=V[i][j];
}
for (r=0;r<NUM;r++)
{
SelectMain(H,r);//选第R列主元,并交换行
for(i=2*NUM-1;i>=r;i--)
H[r][i]=H[r][i]/H[r][r];
for( i=0;i<r;i++)
for(j=2*NUM-1;j>=r;j--)
H[i][j]=H[i][j]-H[i][r]*H[r][j];
for( i=r+1;i<NUM;i++)
for(j=2*NUM-1;j>=r;j--)
H[i][j]=H[i][j]-H[i][r]*H[r][j];
}
for( i=0;i<NUM;i++)
for(j=0;j<NUM;j++)
{
Vi[i][j]=H[i][j+NUM];
}
}
/*
void Gauss_Jordan(double matv[NUM][NUM],double matv1[NUM][NUM])
{
double mat[NUM][2*NUM],d;
int i,j,l,k;
for (i=0;i<NUM;i++) {
for (j=0;j<2*NUM;j++) {
if (j<NUM)
mat[i][j]=matv[i][j];
else
mat[i][j]=0.0;
}
}
for (i=0;i<NUM;i++) mat[i][NUM+i]=1.0;
for (k=0;k<NUM;k++) {
d=fabs(mat[k][k]);
j=k;
for (i=k+1;i<NUM;i++) {//选主元
if (fabs(mat[i][k])>d) {
d=fabs(mat[i][k]);
j=i;
}
}
if (j!=k) { //交换
for (l=0;l<2*NUM;l++) {
d=mat[j][l];
mat[j][l]=mat[k][l];
mat[k][l]=d;
}
}
for (j=k+1;j<2*NUM;j++) {
mat[k][j]/=mat[k][k];
}
for (i=0;i<NUM;i++) {
if (i==k) continue;
for (j=k+1;j<2*NUM;j++) {
mat[i][j]-=mat[i][k]*mat[k][j];
}
}
}
for (i=0;i<NUM;i++) {
for (j=0;j<NUM;j++) {
matv1[i][j]=mat[i][j+NUM];
}
}
}
*/
void GetU(double isw[NUM][NUM],double m1[NUM],double m2[NUM],double U[NUM])
{
int i,j;
double d=0.0;
for(i=0;i<NUM;i++)
{
d=0.0;
for(j=0;j<NUM;j++)
d+=isw[i][j]*(m1[j]-m2[j]);
U[i]=d;
}
}
double GetYt(double U[NUM],double m1[NUM],double m2[NUM])
{
double mm1[NUM],mm2[NUM];
int j;
double d=0.0;
for(j=0;j<NUM;j++)
{
d+=U[j]*(m1[j]+m2[j]);
}
return d/2;
}
void GetY(double U[NUM],double x[N1][NUM],double Y[N1])
{
int i,j;
double d=0.0;
for(i=0;i<N1;i++)
{
d=0.0;
for(j=0;j<NUM;j++)
d+=U[j]*x[i][j];
Y[i]=d;
}
}
void main()
{
double x[N1][NUM];//100A
double y[N2][NUM];//50A
double m1[NUM],m2[NUM],U[NUM];
double sw1[NUM][NUM],sw2[NUM][NUM],sw[NUM][NUM],isw[NUM][NUM];
double Yt;
double Y1[N1],Y2[N2];
int i,j;
for(i=0;i<N1;i++)
for(j=0;j<NUM;j++)
{
x[i][j]=data[0][0][0][j][i];
y[i][j]=data[0][1][0][j][i];
}
Getmj(m1,x);
cout<<"模式1的均值矢量m1为:"<<endl;
Printmj(m1);
Getmj(m2,y);
cout<<"模式2的均值矢量m2为:"<<endl;
Printmj(m2);
GetSWi(sw1,x);
cout<<"模式1的类内离差矩阵SW1为:"<<endl;
PrintSW(sw1);
GetSWi(sw2,y);
cout<<"模式2的类内离差矩阵SW2为:"<<endl;
PrintSW(sw2);
GetSW(sw,sw1,sw2);
cout<<"总类内离差矩阵SW=SW1+SW2为:"<<endl;
PrintSW(sw);
//Gauss_Jordan(sw,isw);
GetVi(isw,sw);
cout<<"总类内离差矩阵SW的逆矩阵SW-1为:"<<endl;
PrintSW(isw);
GetU(isw,m1,m2,U);
cout<<"权矢量U为:"<<endl;
Printmj(U);
Yt=GetYt(U,m1,m2);
cout<<"Yt="<<Yt<<endl;
GetY(U,x,Y1);
cout<<"100元A面60点的Y值:"<<endl;
PrintY(Y1);
GetY(U,y,Y2);
cout<<"50元A面60点的Y值:"<<endl;
PrintY(Y2);
}
/*模式1的均值矢量m1为:
69.3167 61.9333 83.5 70.8167 97.7167 91.4667 87.6333 82.3667
模式2的均值矢量m2为:
59.1833 55.4833 81.8833 63.9167 95.0833 91.0333 91.0667 86.4833
模式1的类内离差矩阵SW1为:
12.7831 27.2211 29.5917 24.2581 8.75639 10.9022 8.18278 1.90056
27.2211 109.529 109.733 88.3544 20.3644 36.4144 18.8922 1.20778
29.5917 109.733 133.217 103.342 22.125 33.3667 24.25 -2.2
24.2581 88.3544 103.342 97.4164 13.3147 24.0022 19.6994 4.28389
8.75639 20.3644 22.125 13.3147 14.1697 13.5322 10.3628 5.92056
10.9022 36.4144 33.3667 24.0022 13.5322 18.7156 10.5211 5.77889
8.18278 18.8922 24.25 19.6994 10.3628 10.5211 10.9656 6.61778
1.90056 1.20778 -2.2 4.28389 5.92056 5.77889 6.61778 12.4656
模式2的类内离差矩阵SW2为:
27.8164 44.9614 48.8214 47.8319 1.56806 17.0772 13.7378 14.9447
44.9614 121.883 62.1564 87.1069 6.10972 43.4006 15.5844 17.0997
48.8214 62.1564 117.27 81.2569 3.25972 25.4206 37.3744 28.2897
47.8319 87.1069 81.2569 107.11 -2.80972 32.4694 13.8389 28.1403
1.56806 6.10972 3.25972 -2.80972 4.84306 3.63056 5.12778 -1.50694
17.0772 43.4006 25.4206 32.4694 3.63056 17.4322 7.66444 6.60056
13.7378 15.5844 37.3744 13.8389 5.12778 7.66444 22.5956 8.91778
14.9447 17.0997 28.2897 28.1403 -1.50694 6.60056 8.91778 13.6831
总类内离差矩阵SW=SW1+SW2为:
40.5994 72.1825 78.4131 72.09 10.3244 27.9794 21.9206 16.8453
72.1825 231.412 171.89 175.461 26.4742 79.815 34.4767 18.3075
78.4131 171.89 250.486 184.599 25.3847 58.7872 61.6244 26.0897
72.09 175.461 184.599 204.526 10.505 56.4717 33.5383 32.4242
10.3244 26.4742 25.3847 10.505 19.0128 17.1628 15.4906 4.41361
27.9794 79.815 58.7872 56.4717 17.1628 36.1478 18.1856 12.3794
21.9206 34.4767 61.6244 33.5383 15.4906 18.1856 33.5611 15.5356
16.8453 18.3075 26.0897 32.4242 4.41361 12.3794 15.5356 26.1486
总类内离差矩阵SW的逆矩阵SW-1为:
0.105698 -0.00414574 -0.0117092 -0.0100391 0.0116707 -0.0298149 -0.0125424
-0.0214614
-0.00414574 0.0495995 -0.000318188 -0.0204626 0.0284905 -0.097914 -0.00495
41 0.0381251
-0.0117092 -0.000318188 0.0288703 -0.0212018 -0.000479244 0.00727187 -0.03
92324 0.0251981
-0.0100391 -0.0204626 -0.0212018 0.0409428 0.00957827 0.0166787 0.0284444
-0.0352334
0.0116707 0.0284905 -0.000479244 0.00957827 0.188321 -0.156279 -0.0680934
0.0437917
-0.0298149 -0.097914 0.00727187 0.0166787 -0.156279 0.316827 0.0276207 -0
.0802034
-0.0125424 -0.0049541 -0.0392324 0.0284444 -0.0680934 0.0276207 0.133449
-0.0654466
-0.0214614 0.0381251 0.0251981 -0.0352334 0.0437917 -0.0802034 -0.0654466
0.113386
权矢量U为:
1.10536 0.0288565 -0.187469 0.0943517 0.849043 -0.845735 -0.382306 -0.335
453
Yt=5.76249
100元A面60点的Y值:
3.67829 7.42418 12.0801 14.611 17.1855 19.2927 20.6103 20.8612
20.1756 18.2124 17.107 15.8688 16.1125 15.3289 15.3094 15.7975
13.9744 11.7536 9.23506 9.73144 9.4175 9.94929 8.88396 10.4935
11.1905 13.7153 15.329 14.8248 15.355 14.8211 16.3832 16.5142
18.0079 16.3482 15.4935 13.5393 12.5404 12.1495 12.1495 12.8658
14.5289 16.0123 16.799 14.2534 12.9987 11.6849 10.3149 11.2188
11.0314 11.1781 12.8125 13.7107 15.615 15.6896 14.1758 13.7346
14.0118 13.5028 13.8509 13.2417
50元A面60点的Y值:
-1.7166 -0.585735 1.92323 3.45935 2.02111 1.42452 -1.74104 -2.33013
-3.4909 -3.55516 -3.62065 -3.90861 -2.37468 0.146194 1.69481 2.02349
-1.14096 -3.55685 -3.89354 -4.31048 -3.78166 -3.04196 -3.88195 -3.50813
-2.65179 -1.85163 -2.79252 -2.99491 -2.86515 -3.0997 -3.29254 -2.13413
-1.9158 -1.95326 -1.57427 -1.57427 -1.48983 -2.86718 -2.33697 -2.69593
-3.09307 -4.83136 -3.30884 -5.59269 -7.91348 -9.88029 -9.33161 -5.51592
-2.59788 0.419927 1.19816 1.25056 -2.02526 -2.51988 -2.34575 -1.89433
-0.386882 -1.22763 -2.59262 -5.16365
Press any key to continue*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -