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

📄 信息量.cpp

📁 这是一段求信息量的C++程序,对输入的一组数据进行求和,及最终算出其信息量和信道容量
💻 CPP
字号:
#include<iostream>
#include<cmath>
using namespace std;
#define M 1000 
void jisuan(int ,int );
struct xinxi{
    double Px[M],Py[M],Ix[M];
    double Pxy[M][M],Px_y[M][M],Py_x[M][M],Ixy[M][M];
    double sum[M];
}a;
void input()
     {
     int i,j,m,n;	
	 double sum1=0;
	 cout<<"输入信源个数:";
     cin>>n; 
	 cout<<"输出信号个数:";
	 cin>>m;
     cout<<"输入"<<n<<"个该信源概率:"<<endl;
     for(i=0;i<n;i++){cout<<"P(x"<<i+1<<"):"; cin>>a.Px[i];  sum1=sum1+a.Px[i];}  
	 if(sum1!=1) {cout<<"输入概率和是"<<sum1<<"不为1,请重输"<<endl; a.Px[n]=NULL;input(); }
   else{ outer:cout<<"输入信道特征:"<<endl;
	  for(i=0;i<n;i++)
		 {  
	    	for(j=0;j<m;j++)
			{   cout<<"P(y"<<j+1<<"/x"<<i+1<<"):";
		    	cin>>a.Py_x[j][i];a.sum[i]+=a.Py_x[j][i];}
           if(a.sum[i]!=1) {
			   	for(j=0;j<n;j++)
				{ a.sum[j]=NULL;}cout<<"输入特征不符请重输"<<endl;goto outer; break; }
			}
	   jisuan(n,m);
	  }
}
void jisuan(int n,int m)
{ 
  int i,j;
  double I,t1=0,t=0,t2=0,t3=0,t4=0;
  double H=0,H1=0,H2=0,H3=0,H4=0;
  cout<<"联合概率:"<<endl;
  for(i=0;i<n;i++)//计算P(xiyi)
 { 
   for(j=0;j<m;j++)
   { a.Pxy[i][j]=a.Px[i]*a.Py_x[j][i];
          cout<<"P(x"<<i+1<<"y"<<j+1<<")="<<a.Pxy[i][j]<<"\t";}
   cout<<endl;
   }
   cout<<"得到的Y集各消息概率:"<<endl;
   for(j=0;j<m;j++)//计算P(yi)
   {
	   for(i=0;i<n;i++)
	   {  
		   a.Py[j]=a.Pxy[i][j]+a.Py[j];}
      cout<<"P(y"<<j+1<<")="<<a.Py[j]<<"\t";
   }
   cout<<endl;
   cout<<"后验概率:"<<endl;
    for(i=0;i<n;i++)//计算P(xi/yi)
   {
	   for(j=0;j<m;j++)
	   {   a.Px_y[i][j]=a.Pxy[i][j]/a.Py[j];
       cout<<"P(x"<<i+1<<"/y"<<j+1<<")="<<a.Px_y[i][j]<<"\t"; }
      cout<<endl;
	   }
  cout<<"自信息量:"<<endl;
	for(i=0;i<n;i++)
	{ 
	  I=-log(a.Px[i])/log(2);
	  a.Ix[i]=I;
     cout<<"I(X"<<i+1<<")="<<a.Ix[i]<<endl;
	}
 cout<<"联合信息量:"<<endl;
	for(j=0;j<m;j++)
	{ 
		for(i=0;i<n;i++)
		{
	         I=-log(a.Pxy[i][j])/log(2);
		 a.Ixy[i][j]=I;
		cout<<"I(X"<<i+1<<"Y"<<j+1<<")="<<a.Ixy[i][j]<<'\t';}cout<<endl;
	}
 for(i=0;i<n;i++)//计算熵值
 { 
	 t1=-a.Px[i]*log(a.Px[i])/log(2);
         H1=H1+t1; 
  for(j=0;j<m;j++)
  { 
         t=-a.Py[j]*log(a.Py[j])/log(2); H=H+t;
         t2=-a.Pxy[i][j]*log(a.Py_x[j][i])/log(2); H2=H2+t2;
   	     t3=-a.Pxy[i][j]*log(a.Px_y[i][j])/log(2); H3=H3+t3;   
         t4=-a.Pxy[i][j]*log(a.Pxy[i][j])/log(2); H4=H4+t4;}
	   }  
cout<<"信源熵:"<<endl<<"H(X)="<<H1<<endl;
cout<<"条件熵:"<<endl<<"H(Y/X)="<<H2<<endl<<"H(X/Y)="<<H3<<endl;
cout<<"联合熵:"<<endl<<"H(XY)="<<H4<<endl; 
cout<<"(交互熵)平均互信息:"<<endl<<"I(X;Y)="<<H1-H3<<endl<<"I(Y;X)="<<H-H2<<endl;

}
void main()
{   cout<<endl<<"\t\t\t \25信息量及信道容量的计算\25"<<endl<<endl;
	input();
   	cout<<endl;
}

⌨️ 快捷键说明

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