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

📄 bayes.cpp

📁 文件中包含多种模式识别常用的算法
💻 CPP
字号:
#include<iostream.h>
#include<math.h>
#include<stdlib.h>

void mt(float *a,float *b,int row,int column)//矩阵求转置函数
{
	int i,j;//a是转置前矩阵 b是转置后的矩阵 row为矩阵的行数 column是矩阵的列数
    float temp;
    for(i=0;i<row;i++)
		for(j=0;j<column;j++)
		{
			temp=*(a+i*column+j);
			*(b+j*row+i)=temp;
		}
}

void subb(float *a,float *b,int n,float *c)//矩阵相减函数
{                                          //c中存放差矩阵
   int i;
   for(i=0;i<n;i++)
   {
	   *(c+i)=*(a+i)-*(b+i);
   }
}

void madd(float *a,float *b,int n,float *c)//矩阵相加函数
{                                          //c中存放和矩阵
   int i;
   for(i=0;i<n;i++)
   {
	   *(c+i)=*(a+i)+*(b+i);//fabs是浮点数绝对值函数
   }
}

void kmul(float *a,int n,float c,float *b)//矩阵数乘函数
{
   int i;
   for(i=0;i<n;i++)
   {
	   *(b+i)=(*(a+i))*c;
   }
}

void bmul(float *a,float *b,int m,int n,int k,float *result)//矩阵相乘矩阵
{ 
	int i,j,l,u;              //矩阵result=矩阵a*矩阵b
    for (i=0; i<=m-1; i++)    //m是矩阵a的行数,n是矩阵a的列数 k是矩阵b的列数
		for (j=0; j<=k-1; j++)
		{
			u=i*k+j;
			result[u]=0.0;
			for (l=0; l<=n-1; l++)
				result[u]=result[u]+a[i*n+l]*b[l*k+j];
		}
    return;
}

int inv(float *a,int n) //矩阵求逆函数 n是矩阵a的阶数
{
	int *is,*js,i,j,k,l,u,v;
    float d,p;
    
    is=new int [n];
    js=new int [n];
  
    for (k=0; k<=n-1; k++)
	{
		d=0.0;
        for (i=k; i<=n-1; i++)
			for (j=k; j<=n-1; j++)
			{
				l=i*n+j;
				p=fabs(a[l]);
				if (p>d) { d=p; is[k]=i; js[k]=j; }
			}
        if (d+1.0==1.0)
		{
			delete is;
			delete js;
			cout<<"error matrix can not inv"<<endl;
            return(0);
		}
        if (is[k]!=k)
			for (j=0; j<=n-1; j++)
			{
				u=k*n+j; v=is[k]*n+j;
				p=a[u]; a[u]=a[v]; a[v]=p;
            }
        if (js[k]!=k)
			for (i=0; i<=n-1; i++)
            {
				u=i*n+k; v=i*n+js[k];
				p=a[u]; a[u]=a[v]; a[v]=p;
            }
        l=k*n+k;
        a[l]=1.0/a[l];
        for (j=0; j<=n-1; j++)
		  if (j!=k)
		  { u=k*n+j; a[u]=a[u]*a[l]; }
        for (i=0; i<=n-1; i++)
          if (i!=k)
            for (j=0; j<=n-1; j++)
              if (j!=k)
                {
				  u=i*n+j;
                  a[u]=a[u]-a[i*n+k]*a[k*n+j];
                }
        for (i=0; i<=n-1; i++)
          if (i!=k)
		  { u=i*n+k; a[u]=-a[u]*a[l];}
	}
    for (k=n-1; k>=0; k--)
	{
		if (js[k]!=k)
          for (j=0; j<=n-1; j++)
            {
			  u=k*n+j; v=js[k]*n+j;
              p=a[u]; a[u]=a[v]; a[v]=p;
            }
        if (is[k]!=k)
          for (i=0; i<=n-1; i++)
            {
			  u=i*n+k; v=i*n+is[k];
              p=a[u]; a[u]=a[v]; a[v]=p;
            }
	}
    delete is; delete js;
    return(1);
}


void main()
{
	float x1[4][2]={{0,0},{2,0},{2,2},{0,2}};
	float x2[4][2]={{4,4},{6,4},{6,6},{4,6}};
	float x[2];
	float xr[2][2];
	float *temp;
	float p1=0.5;
	float p2=0.5;
	float m1[2]={0,0};
	float m2[2]={0,0};
	float m1r[2][2],m2r[2][2];
	float m[2];
	float c1[2][2]={{0,0},{0,0}};
	float c2[2][2]={{0,0},{0,0}};
	float mc1[2],mc2[2];
	float result[2];
	float con1,con2;
	float N1=4;
	float N2=4;
	int i,j,k=0;

	for(i=0;i<N1;i++)
	{
		temp=&x1[i][0];
		x[0]=*temp;
		x[1]=*(temp+1);
		madd(&m1[0],&x[0],2,&m1[0]);
		bmul(&x[0],&x[0],2,1,2,&xr[0][0]);
		madd(&c1[0][0],&xr[0][0],4,&c1[0][0]);
	}
	kmul(&m1[0],2,1/N1,&m1[0]);
	kmul(&c1[0][0],4,1/N1,&c1[0][0]);
	bmul(&m1[0],&m1[0],2,1,2,&m1r[0][0]);
	subb(&c1[0][0],&m1r[0][0],4,&c1[0][0]);

	for(i=0;i<N2;i++)
	{
		temp=&x2[i][0];
		x[0]=*temp;
		x[1]=*(temp+1);
		madd(&m2[0],&x[0],2,&m2[0]);
		bmul(&x[0],&x[0],2,1,2,&xr[0][0]);
		madd(&c2[0][0],&xr[0][0],4,&c2[0][0]);
	}
	kmul(&m2[0],2,1/N2,&m2[0]);
	kmul(&c2[0][0],4,1/N2,&c2[0][0]);
	bmul(&m2[0],&m2[0],2,1,2,&m2r[0][0]);
	subb(&c2[0][0],&m2r[0][0],4,&c2[0][0]);

	for(i=0;i<2;i++)
		for(j=0;j<2;j++)
			if(c1[i][j]==c2[i][j]) k++;

	if(k==4)
	{
		subb(&m1[0],&m2[0],2,&m[0]);
		inv(&c1[0][0],2);
		bmul(&m[0],&c1[0][0],1,2,2,&result[0]);
		bmul(&m1[0],&c1[0][0],1,2,2,&mc1[0]);
		bmul(&mc1[0],&m1[0],1,2,1,&con1);
		con1=con1/2;
		bmul(&m2[0],&c2[0][0],1,2,2,&mc2[0]);
		bmul(&mc2[0],&m2[0],1,2,1,&con2);
		con2=con2/2;

		cout<<"the solution is:"<<endl;
		cout<<result[0]<<" "<<result[1]<<" "<<con2-con1<<endl;
	}
	else cout<<"error!"<<endl;
}

⌨️ 快捷键说明

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