📄 信息量.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 + -