📄 信道容量.cpp
字号:
#include<iostream.h>
#include<math.h>
#include<stdlib.h>
#define ZERO 1e-20
#define e 2.718281828459
double max(double *a,int r)
{
int i=0;
double max=0.0;
while(i<r)
{
if(max<*(a+i))
{
max=*(a+i);
i++;
}
else
{ max=max;
i++;
}
}
return max;
}
void main()
{
int r,s,i1,i2;
cout<<"请输入输入符号集大小(r):";
cin>>r;
cout<<"请输入输出符号集大小(s):";
cin>>s;
double u=0.0;
double IL=0.0;
double IU=0.0;
double *pp=new double[r];
double *q=new double[s];
double *a=new double[r];
double *sumi=new double[r];
double *sumj=new double[s];
/*
double **p=new double*[r];//第一维
for(int i=0;i<r;i++)
{
p[i]=new double[s]; //分配第二维,每一行的空间
}
*/
double **p=(double **)calloc(r,sizeof(double));
for(int i=0;i<r;i++)
p[i]=(double *)calloc(s,sizeof(double));
cout<<"请输入转移矩阵(先行后列):"<<endl;
for(i1=0;i1<r;i1++)
{
for(i2=0;i2<s;i2++)
{
cin>>p[i1][i2];
double x=0;
x+=p[i1][i2];
if(x!=1)
{cout<<"转移矩阵错误!"<<endl;}//检查输入错误
}
}
cout<<"请输入初始概率分布:"<<endl;
for(i1=0;i1<r;i1++)
{
cin>>pp[i1];
}
double x=0;
x+=p[i1][i2];
if(x!=1)
{cout<<"初始分布错误!"<<endl;}//检查输入错误
do
{
for(i2=0;i2<s;i2++)//计算qj
{
double S=0.0;
for(i1=0;i1<r;i1++)
{
sumi[i1]=pp[i1]*p[i1][i2];
}
for(int i=0;i<r;i++)
{
S+=sumi[i];
}
q[i2]=S;
}
for(i1=0;i1<r;i1++)//计算ai
{
double S=0.0;
for(i2=0;i2<s;i2++)
{
if(p[i1][i2]<ZERO)//处理0*log0的问题
{sumj[i2]=0.0;}
else
sumj[i2]=p[i1][i2]*log(p[i1][i2]/q[i2]);
}
for(int i=0;i<s;i++)
{
S+=sumj[i];
}
a[i1]=pow(e,S);
}
for(i=0;i<r;i++)//计算u
{
u+=pp[i]*a[i];
}
IL=log(u)/log(2);//计算IL
IU=log(max(a,r))/log(2);//计算IU
if((IL-IU)>=ZERO)
{
for(i=0;i<r;i++)
{pp[i]=pp[i]*a[i]/u;}
}
else
{
cout<<"信道容量为:"<<IL<<endl;
}
}
while((IL-IU)>=ZERO);
free(a);//释放内存
a=NULL;
free(q);
q=NULL;
free(sumi);
sumi=NULL;
free(sumj);
sumj=NULL;
for(i=0;i<r;i++)
{
free(p[i]);
p[i]=NULL;
}
free(p);
p=NULL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -