#include <iostream>
#include <cmath>
#include <string>
using namespace std;
int main()
{
int i,j,k,m,n;
char r;
char A='Y',B='N';
double x[20],p[12][12],q[12][12],y[20];
cout<<"输入信源x的个数N=";
cin>>n;
cout<<"输入所需信源概率:"<<endl;
for(i=1;i<=n;i++)
{
cout<<"x("<<i<<")=";
cin>>x[i-1];
}
cout<<"输入信道矩阵:"<<endl;
for(i=1;i<=n;i++)
{
for(k=1;k<=n;k++)
{
cout<<"请输入P(y"<<k<<"/x"<<i<<")=";
cin>>p[i-1][k-1];
}
}
//for(;;);
// {
cout<<"1信源熵2条件熵3联合熵4交互熵"<<endl;
cout<<"选择所要计算的熵值:"<<endl;
cin>>m;
if(m==1)
{
double H=0,h;
for(int j=1;j<=n;j++)
{
h=-x[j-1]*log10(x[j-1])/log10(2);
H=H+h;
}
cout<<"信源熵为:"<<H<<endl;
}
else if(m==2)
{
double H1=0,h1=0 ,H2=0,h2=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
q[i-1][j-1]=p[i-1][j-1]*x[i-1];
//cout<<"联合概率"<<"y"<<i<<"x"<<j<<q[i-1][j-1]<<" "<<endl;
h1=-q[i-1][j-1]*log10(p[i-1][j-1])/log10(2);
H1=H1+h1;
}
}
y[j-1]=y[j-1]+q[i-1][j-1];
cout<<"信源y"<<i<<y[j-1]<<" "<<endl;
h2=-q[i-1][j-1]*log10(q[i-1][j-1]/y[j-1])/log10(2);
H2=H2+h2;
}
cout<<"条件熵H(Y/X)为:"<<H1<<endl;
cout<<"条件熵H(x/y)为:"<<H2<<endl;
}
else if(m==3)
{
double H3=0,h3=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
q[i-1][j-1]=p[i-1][j-1]*x[i-1];
H3=-q[i-1][j-1]*log10(q[i-1][j-1])/log10(2);
H3=h3+H3;
}
}
cout<<"联合熵H(xy)为:"<<H3<<endl;
}
else if(m==4)
{
double H4=0,h4=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
q[i-1][j-1]=p[i-1][j-1]*x[i-1];
H4=-q[i-1][j-1]*log10(q[i-1][j-1]/x[i-1])/log10(2);
H4=h4+H4;
}
}
cout<<"交互熵I(x;y)=I(y;x)为:"<<H4<<endl;
}
// cout<<"是否继续计算,继续请输入Y,退出请输入N!"<<endl; // cout<<"请输入Y或者N,进行选择: ";
// cin>>r;
// if (r==A)
// {continue;}
// if (r==B)
// {break;}
//}
return 0;
}。