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

📄 新建 文本文档.txt

📁 信息论与编?氲牟街? (1). 把信源符号按概率大小顺序排列
💻 TXT
字号:
#include<iostream.h>
#include<math.h>
const int n=2;
const int m=2;
double a[n][m];
double b[n];
double c[m];
double sum;
double danHb; 
double Lianhe;
double Hc;
void input();
void output();
void panduan();
void LianheH();
void BH();
void CH();
void QiTA();
void main()
{
	input();
	output();
	panduan();
    LianheH();
    BH();
    CH();
    QiTA();
}
void input()
{
	cout<<"请输入联合概率密度  :\n";
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
			cin>>a[i][j];
}
void panduan()
{ 
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
			sum+=a[i][j];
		if(sum==1.0)
			cout<<"将执行下面操作:"<<endl;
		else if(sum!=1.0)
		{
			cout<<" 输入错误,请重新输入     :"<<endl;
			input();
		}
            
		
}
            

void output()
{
		for(int i=0;i<n;i++)
		 for(int j=0;j<m;j++)
			cout<<" "<<a[i][j];
		 cout<<endl;
}
void LianheH()
{
  for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
			Lianhe+=a[i][j]*(log(a[i][j])/log(2))*(-1) ;
		    cout<<"联合熵为   "<<Lianhe<<endl;
}
void BH()
{

	for(int i=0;i<n;i++)
    	for(int j=0;j<m;j++)
		  b[i]+=a[i][j];
	
    for( i=0;i<n;i++)
	
	    cout<<" "<<b[i]<<endl;
	    danHb=b[0]*(log(b[0])/log(2))*(-1)+b[1]*(log(b[1])/log(2))*(-1);
	    cout<<"H(B)熵为  "<<danHb<<endl;
	
	
}
void CH()
 {
	
    for(int j=0;j<m;j++)
    	for(int i=0;i<n;i++)
		  c[j]+=a[i][j];
    for( j=0;j<m;j++)
	  cout<<" "<<c[j]<<endl;
	  Hc=c[0]*(log(c[0])/log(2))*(-1)+c[1]*(log(c[1])/log(2))*(-1);
	    cout<<"H(C)熵为  "<< Hc<<endl;
}
void QiTA()
{
	double Fu,XY,YX;
	Fu=danHb+Hc-Lianhe ;
	XY=danHb-Fu;
	YX=Hc-Fu;
	cout<<"B条件C的熵, C条件B的熵,互信息量分别为   "<<XY<<" "<<YX<<" "<<Fu<<endl;
}





#include<iostream.h>            //用于求有关已知一个随机事件的概率和条件概率的题型
#include<math.h>
const int n=2;                //n和m表示两个随机事件的离散信源
const int m=2;
double a[n][m];              //条件概率分布
double Lianhe[n][m];         //联合概率分布
double b[n];                 //X的概率分布
double c[m];                 //Y的概率分布
double Lianheshang;          //联合熵
double danHX;                //H(x)
double Xtiaojian;            //H(Y/X)
double Ytiaojian;            //H(X/Y)
double danHy;                //H(Y)
double Huxin;                //I(X;Y)
void input();                //用于输入数据
void QiTai();                //用于计算其他概率
void LianheH();              //用于计算联合熵
void BH();                   //用于计算H(x)
void Tiaojian();             //用于计算H(Y/X)
void Yshang();               //用于计算H(Y)
void QiTashang();            //用于计算H(X/Y)和I(X;Y)
void main()
{
	input();
	QiTai();
    LianheH();
    BH();
    Tiaojian();
    Yshang();
    QiTashang();
}
void input()
{
 cout<<"请输入事件X的概率密度  :\n";
 cin>>b[0];
 cout<<"请输入x1条件下y1的概率密度  :\n";
 cin>>a[0][0];
 cout<<"请输入x2条件下y1的概率密度  :\n";
 cin>>a[1][0];
}
void QiTai()
{
	b[1]=1-b[0];
	a[0][1]=1-a[0][0];
	a[1][1]=1-a[1][0];
    for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
		 Lianhe[i][j]=b[i]*a[i][j];
	}
  cout<<"联合概率分布为:"<<endl;
  for( i=0;i<n;i++)
		for(int j=0;j<m;j++)

		cout<< Lianhe[i][j]<<endl;
		


}
void BH()
{

	
    for(int i=0;i<n;i++)
	    danHX+=b[i]*(log(b[i])/log(2))*(-1);
	    cout<<"H(X)熵为  "<<danHX<<endl;
	
	
}

void LianheH()
{
  for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
			Lianheshang+=Lianhe[i][j]*(log(Lianhe[i][j])/log(2))*(-1) ;
		    cout<<"联合熵为   "<<Lianheshang<<endl;
}
void  Tiaojian()
{
   for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
			Xtiaojian+=Lianhe[i][j]*(log(a[i][j])/log(2))*(-1) ;
		    cout<<"H(Y/X)为   "<<Xtiaojian<<endl;
}
void Yshang()
{
	for(int j=0;j<m;j++)
    	for(int i=0;i<n;i++)
		  c[j]+=Lianhe[i][j];
	cout<<"Y的概率分布为 :"<<endl;
    for(int i=0;i<n;i++)
	
	    cout<<c[i]<<endl;
	    danHy=c[0]*(log(c[0])/log(2))*(-1)+c[1]*(log(c[1])/log(2))*(-1);
	    cout<<"H(Y)熵为  "<<danHy<<endl;
}
void QiTashang()
{ 
    Ytiaojian=Lianheshang-danHy;
    Huxin=danHX+danHy-Lianheshang;
	cout<<"H(X/Y)为 "<<Ytiaojian<<endl;
	cout<<"I(X;Y)为 "<<Huxin<<endl;
}
	







#include<iostream.h>                 //用于计算已知联合概率题型
#include<math.h>
const int n=2;                      //n和m表示两个随机事件的离散信源
const int m=2;
double a[n][m];                    //联合概率分布
double b[n];                       //X的概率分布
double c[m];                       //Y的概率分布
double sum;                        //用于判断输入的联合概率是否正确
double danHb;                      //H(x)
double Lianhe;                     //联合熵
double Hc;                         //H(Y)
void input();                      //用于输入数据
void output();                     //用于输出数据
void panduan();                    //用于判断输入的联合概率是否正确
void LianheH();                    //用于计算联合熵
void BH();                         //用于计算H(x)
void CH();                         //用于计算H(Y)
void QiTA();                       //用于计算H(Y/X),H(X/Y)和(9X;Y)
void main()
{
	input();
	output();
	panduan();
    LianheH();
    BH();
    CH();
    QiTA();
}
void input()
{
	cout<<"请输入联合概率密度  :\n";
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
			cin>>a[i][j];
}
void panduan()
{ 
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
			sum+=a[i][j];
		if(sum==1.0)
			cout<<"将执行下面操作:"<<endl;
		else if(sum!=1.0)
		{
			cout<<" 输入错误,请重新输入     :"<<endl;
			input();
		}
            
		
}
            

void output()
{       cout<<"联合概率分布"<<endl;
		for(int i=0;i<n;i++)
		 for(int j=0;j<m;j++)
			cout<<" "<<a[i][j];
		 cout<<endl;
}
void LianheH()
{
  for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
			Lianhe+=a[i][j]*(log(a[i][j])/log(2))*(-1) ;
		    cout<<"联合熵为   "<<Lianhe<<endl;
}
void BH()
{

	for(int i=0;i<n;i++)
    	for(int j=0;j<m;j++)
		  b[i]+=a[i][j];
	 cout<<"X的概率分布为 "<<endl;
    for( i=0;i<n;i++)
	
	    cout<<b[i]<<endl;
	    danHb=b[0]*(log(b[0])/log(2))*(-1)+b[1]*(log(b[1])/log(2))*(-1);
	    cout<<"H(X)熵为  "<<danHb<<endl;
	
	
}
void CH()
 {
	
    for(int j=0;j<m;j++)
    	for(int i=0;i<n;i++)
		  c[j]+=a[i][j];
    cout<<"Y的 概率分布为 "<<endl;
    for( j=0;j<m;j++)
	  cout<<c[j]<<endl;
	  Hc=c[0]*(log(c[0])/log(2))*(-1)+c[1]*(log(c[1])/log(2))*(-1);
	    cout<<"H(Y)熵为  "<< Hc<<endl;
}
void QiTA()
{
	double Fu,XY,YX;
	Fu=danHb+Hc-Lianhe ;
	XY=danHb-Fu;
	YX=Hc-Fu;
	cout<<"X条件Y的熵, Y条件X的熵,互信息量分别为   "<<XY<<" "<<YX<<" "<<Fu<<endl;
}

#include<iostream.h>
#include<math.h>
double a[10];              //用于存储符号的概率
int n;                     //请输入单符号信源元素个数
double b[10];              //用于存储码字的概率
int k[10];                 //用于存储Ki的K直
int c[10];                 //用于存储二进吗
void input();              //输入数据函数
void paixi();              //对概率排序
void output();             //输出函数
void bgailui();            //用于求码字的概率
void kjisuan();            //用于求Ki的K直
void bbianma();            //用于编码
void panduan();            //用于对输入数据判断,避免符号的总和概率》1
void main()
{
	input();
    panduan();
	paixi();
	output();
    bgailui();
    kjisuan();
    bbianma();
}
void input()
{
	cout<<"请输入单符号信源元素个数 :\n";
	cin>>n;
	cout<<"请输入单符号概率  :\n";
	for(int i=1;i<n+1;i++)
		cin>>a[i];
}
void panduan()
{
    double sum=0;
    for(int i=0;i<n+1;i++)
	
			sum+=a[i];
	
	cout<<""<<sum<<endl;
		if(sum==1.0)
			cout<<"将执行下面操作:"<<endl;
		else if(sum!=1.0)
		{
			cout<<" 输入错误,请重新输入     :"<<endl;
			input();
		}
}
            

void paixi()
{
	int i,j,k;
	double x;
	for(i=1;i<n+1;i++)
	{
		k=i-1;
		for(j=i;j<n+1;j++)
			if(a[j]>a[k])
				k=j;
			x=a[i-1];a[i-1]=a[k];a[k]=x;
	}
}
void output()
{
	for(int i=0;i<n;i++)
		cout<<" "<<a[i]<<endl;
}
void bgailui()
{
	b[0]=0;
    for(int i=0;i<n;i++)
   {
	  b[i+1]=b[i]+a[i];
   }
	cout<<"累加概率分布为"<<endl;
   for( i=0;i<n;i++)
   cout<<" "<<b[i]<<endl;
}
void kjisuan()
{
	for(int i=0;i<n;i++)
	{
		if((-1)*log(a[i])/log(2)==int((-1)*log(a[i])/log(2)))
			k[i]=int((-1)*log(a[i])/log(2));
		else
			k[i]=int((-1)*log(a[i])/log(2))+1;
	}
	for(i=0;i<n;i++)
		cout<<" "<<k[i]<<endl;
}
void bbianma()
{
    double x;
	for(int i=0;i<n;i++)
	{
		x=b[i];
        for(int j=0;j<n;j++)
		{
           if(x<=0.5)
		   {
              if(x==int(x))
			    x=0;
		      else
                x=x*2;
                c[j]=int(x);
		   }
		   else if(x>0.5)
		   {
              if(x==int(x))
			    x=0;
			  else
				  x=(x-int(x))*2;
			      c[j]=int(x);
		   }

		 
		}
		
	 for(j=0;j<k[i];j++)
         	cout<<""<<c[j];
		 cout<<endl;
	}
}
		

⌨️ 快捷键说明

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