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

📄 信道容量.cpp

📁 此程序用于计算信道用量
💻 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 + -