#include
#include
#include
void main()
{
register int i,j;
register int k;
int r,s; /*信道矩阵的行数和列数*/
float *p=NULL;
float *q=NULL;
float *d=NULL;
float *a=NULL;
float **p_ji=NULL; /*二维数组p_yx存放信道矩阵*/
float C,u,max,t,IU; /*C为信道容量*/
printf("the number of input information source:\nr="); /*输入行数和列数*/
scanf("%d",&r);
printf("the number of output information source:\ns=");
scanf("%d",&s);
p=(float *)calloc(r,sizeof(float)); /*初始化需要用到的数组*/
q=(float *)calloc(r,sizeof(float));
d=(float *)calloc(r,sizeof(float));
a=(float *)calloc(r,sizeof(float));
p_ji=(float **)calloc(r,sizeof(float));
for(i=0;i
p_ji[i]=(float *)calloc(r,sizeof(float));
printf("Please matrix of channel:\n"); /*输入信道矩阵*/
for(i=0;i
{
for(j=0;j
{
printf("p_ji[%d][%d]=",i,j);
scanf("%f",&p_ji[i][j]);
}
printf("\n");
}
for(i=0;i
{
t=0.0;
for(j=0;j
t=t+p_ji[i][j];
if(t<=0.999999||t>=1.000001)
{
printf("Error!");
exit(-1);
}
}
for(i=0;i
p[i]=1.0/r;
for(j=0;j
{
q[j]=0;
for (i=0;i
q[j]=q[j]+p[i]*p_ji[i][j];
}
for(i=0;i
{
d[i]=0;
for(j=0;j
{
if(p_ji[i][j]==0)
d[i]=d[i]+0;
else
d[i]=d[i]+p_ji[i][j]*log(p_ji[i][j]/q[j]);
}
a[i]=exp(d[i]);
}
u=0.0;
for(i=0;i
u=u+p[i]*a[i];
C=log(u)/log(2.0);
max=a[0];
for(i=0;i
{
if(a[i]>=max)
max=a[i];
}
IU=log(max)/log(2.0); /*计算IU*/
k=1;
while((IU-C)>=10e-6) /*迭代计算*/
{ /*计算最佳输入分布p[i]*/
for(i=0;i
p[i]=p[i]*a[i]/u;
for(j=0;j
{
q[j]=0;
for (i=0;i
q[j]=q[j]+p[i]*p_ji[i][j];
}
for(i=0;i
{
d[i]=0;
for(j=0;j
{
if(p_ji[i][j]==0)
d[i]=d[i]+0;
else
d[i]=d[i]+p_ji[i][j]*log(p_ji[i][j]/q[j]);
}
a[i]=exp(d[i]);
}
u=0.0;
for(i=0;i
u=u+p[i]*a[i];
C=log(u)/log(2.0); /*计算IL*/
max=a[0];
for(i=0;i
{
if(a[i]>=max)
max=a[i];
}
IU=log(max)/log(2.0); /*计算IU*/
k=k+1;
}
printf("The matrix of channel is:\n"); /*输出信道矩阵*/
for(i=0;i
{
for(j=0;j
printf("%.3f ",p_ji[i][j]);
printf("\n");
}
printf("The iteration number is:\nk=%d\n",k); /*输出迭代次数*/
printf("The best input probability distribution is:\n"); /*计算输出信源的概率分布q[j]*/
for(i=0;i
printf("%.3f ",q[i]);
printf("\nThe capacity of the channel is:\nC=%fbit/symbol\n",C); /*输出信道容量*/
printf("The best input probability distribution is:\n"); /*输出最佳输入分布*/
for(i=0;i
printf("%.3f ",p[i]);
}