**
Fisher线性判别
** ![在这里插入图片描述](https://img-blog.csdnimg.cn/202012281028327.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201228102853615.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkxOTMyNw==,size_16,color_FFFFFF,t_70) ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020122810291696.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkxOTMyNw==,size_16,color_FFFFFF,t_70)
【例4-1】本程序为纸币100元A面与50元A 面的Fisher判别门限的程序,通过全局变量 dat自动从样本数据中将内容读入dat[10][4][8][8][60],dat为一个五维数组,第一维代表10 个样本,第二维代表人民币的币种,第三维代表旧版人民币的四个传感器数据和新
版人民币的四个传感器的数据,第四维代表八个传感器,第五维代表60次采样,程序将记录100元A面与50元A面各自的均值矢量、类内离差矩阵、类内离差总矩阵、投影特征向量和判别阈值。
//慰慰
double sw[32][8][8];//类内离差矩阵
double mj[32][8];//模式均值矢量
double sww[8][8];//类间离差矩阵
//fisher.cpp:Defines the entry point for the console application.//
//rmbdis.cpp:Defines the entry point for the console appication.//
#include"stdio.h"
#include"math.h"
#include"conio.h"
#include
#include
using namespace std;
#define PNUM 60
unsigned char dat[10][4][8][8][60]={
//0--样本1,1--样本1,...,8--样本9,9--样本10
//0--100,1--50,2--20,3--10
//O--A向,1--B向,2--C向,3--D向,4--新版A向,5-新版B向,6--新版C向,7-新版D向
//0--传感1,1--传感2,2--传感3,3--传感4,4--传感5,5--传感6,6--传感7,7--传感8
{
#include"C:\\Users\\慰\\Desktop\\fisher线性判别\\样本\\rmb00.txt"
},
{
#include"C:\\Users\\慰\\Desktop\\fisher线性判别\\样本\\rmb01.txt"
},
{
#include"C:\\Users\\慰\\Desktop\\fisher线性判别\\样本\\rmb02.txt"
},
{
#include"C:\\Users\\慰\\Desktop\\fisher线性判别\\样本\\rmb03.txt"
},
{
#include"C:\\Users\\慰\\Desktop\\fisher线性判别\\样本\\rmb04.txt"
},
{
#include"C:\\Users\\慰\\Desktop\\fisher线性判别\\样本\\rmb06.txt"
},
{
#include"C:\\Users\\慰\\Desktop\\fisher线性判别\\样本\\rmb07.txt"
},
{
#include"C:\\Users\\慰\\Desktop\\fisher线性判别\\样本\\rmb08.txt"
},
{
#include"C:\\Users\\慰\\Desktop\\fisher线性判别\\样本\\rmb09.txt"
}
};
#define NUM 8
double Eueliden(double x[],double y[],int n)
{
double d;
d=0.0;
for(int i=0;i
double d;
d=0.0;
for(int i=0;i
double d;
d=0.0;
for(int i=0;i
double d;
d=0.0;
for(int i=0;i
double dx,dy;
int i,j;
dx=0.0;
for(i=0;i
dy+=matv1[i][j]*(x[j]-y[j]);
}
dx+=dy*(x[i]-y[i]);
}
return dx;
}
void GetMatV(double V[8][8],int k)
{
int i,j,m,n1,n2,n3;
double xm[8],d,x,y;
m=4*8*PNUM;
for(i=0;i
for(n2=0;n2
d+=(double)dat[k][1][n2][i][n3];
}
}
}
d/=m;
xm[i]=d;
}
for(i=0;i
d=0;
for(n1=0;n1
for(n3=0;n3
int n=8;
double mat[8][16],d;
int i,j,l,k;
for(i=0;i
if(j
if(fabs(mat[i][k])>d){//选主元
d=fabs(mat[i][k]);
j=i;
}
}
if(j!=k){//交换
for(l=0;l
mat[k][j]/=mat[k][k];
}
for(i=0;i
mat[i][j]-=mat[i][k]*mat[k][j];
}
}
}
for(i=0;i
matv1[i][j]=mat[i][j+n];
}
}
}
void getswj(double mats[8][8],double mj[8],unsigned char data[8][60])
{
int i,j,k;
for(i=0;i
mj[i]+=(double)data[i][k];
}
mj[i]/=60.0;
}
for(i=0;i
mats[i][j]=0;
for(k=0;k
int i,j,k,m;
for(i=0;i
for(k=0;k
for(j=0;j
for(k=0;k
int i,j,k;
double m[8];
for(i=0;i
for(k=0;k
for(j=0;j
sb[i][j]+=(mj[k][i]-m[i])*(mj[k][j]-m[j]);
}
sb[i][j]/=32;
}
}
}
void getsw(double swj[32][8][8],double sw[8][8])
{
int i,j,k;
for(i=0;i
sw[i][j]=0;
for(k=0;k
int i,j,k;
for(i=0;i
matc[i][j]=0;
for(k=0;k
int i,j;
for(i=0;i
matc[i][j]=mata[i][j]+matb[i][j];
}
}
}
void MatDec(double mata[8][8],double matb[8][8],double matc[8][8])
{
int i,j;
for(i=0;i
matc[i][j]=mata[i][j]-matb[i][j];
}
}
}
void getst(double sw[8][8],double sb[8][8],double st[8][8])
{
MatAdd(sw,sb,st);
}
double MatTrace(double mat[8][8])
{
int i;
double d=0.0;
for(i=0;i
int i,j;
for(i=0;i
outfile
d+=x[i]*y[i];
}
return d;
}
int main(int argc,char*argv[])
{
double sw[32][8][8];
double mj[32][8];
double sww[8][8];
double sww1[8][8];
int i,j;
/*get4sw(sw[0],mj[0],dat[0][0]);
get4sw(sw[8],mj[8],da[0][1]);
get4sw(sw[16],mj[16],dat[0][2]);
get4sw(sw[24],mj[24],dat[0][3]);*/
char name[20]="sw100a.h";
for(i=0;i
outfile
for(j=0;j
for(j=0;j
for(j=0;j
for(j=0;j
d=0.0;
for(j=0;j
outfile
for(j=0;j |