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

📄 zbl.cpp

📁 在VC下的
💻 CPP
字号:
#include <iostream>
#include <cfloat>
#include <cmath>
#include <vector>
#include <cstdlib>

using namespace std;



bool validate(float sum);
void Initiaze_P_i(short r);
void Calcu(short r,short s,vector<float*>&Pij);
void Free(vector<float*> p);

#define First_C  -1000000
#define Delt  0.001 
 


void main()
{  
	cout<<"请按照提示输入信源,信宿与信道相关数值"<<endl;
	
	short r,s;
	
	cout<<"信源符号个数r:";
	cin>>r;
	cout<<'\n';
	cout<<"信宿符号个数s:";
	cin>>s;

 	
 
    cout<<"信道转移概率矩阵P:";	       
    vector<float*> 	Pij;
	for (int i = 0; i < r; i++)
	{
		float Sum; 		
	do{
		Sum =0.0;
	    float *P_ij=new float[s]; 
		cout<<"\n第"<<i <<"行:"<<'\n';
		for (int j=0; j<s-1; j++)
		{
			cin>>P_ij[j];
			Sum+=P_ij[j];
		}
	}while (validate(Sum));
	        
	        float *P_ij=new float[s];
			P_ij[s-1]=1.0-Sum;
			cout<<P_ij[s-1];
            Pij.push_back(P_ij);
	}  
	
     Calcu(r,s,Pij);
	Free(Pij);
	 
}
 





void Calcu(short r,short s,vector<float*> &Pij)
{
	
		float *P_i=new 	float;
		cout<<"\n正在初始化信源分布……"<<"\n输入概率分布";
        for (int k = 0; k < r; k++)
		{
			P_i[k] = 1.0 / (float)r;
			cout<<P_i[k]<<'\t';
		}
		cout<<endl;
		float C= (float)First_C;
		float New_C =(float)First_C;
		vector<float*> phase_ij;
		for (k = 0; k < r; k++)	
		{
		float *pha = new float[s];		
		phase_ij.push_back(pha);
		} 
		do
		{
			C=New_C;
		for (int i = 0; i < r; i++)
		{
			for (int j = 0; j < s; j++)
			{			
				float p_j = 0.0f;
				for (int i= 0; i < r; i++)
					p_j+=P_i[i]*Pij[i][j];
				phase_ij[i][j] = (P_i[i] * Pij[i][j]) / p_j;
			}
		}
			
	
			 float *fenzi = new float[r];
			 float fenmu=0.0f;
		for (i = 0; i < r; i++)
		{		
			float Sum = 0.0f;
			for (int j = 0; j < s; j++)
			{
				Sum += Pij[j][i] * logf(phase_ij[i][j]);
			}
			fenzi[i] = expf(Sum);
			fenmu+= fenzi[i];
		}
		for (i = 0; i < r; i++)
		{			
			P_i[i] = fenzi[i] / fenmu;
		}
		New_C = logf(fenmu);
	} while(fabs(New_C- C) / C> Delt);
	
		cout<<"信道容量为:"<<New_C<<endl;
		
	Free(phase_ij); 
	

		
}



bool validate(float sum)
		{
			if (sum-1.0 > 0)
			{
				cout<<"错误:转移概率之和不能大于1,请重新输入:";
			    return true;
			}
			else 
				return false;
}
void Free(vector<float*> p)
{
	for (int  i=0; i<p.size(); i++)
	{
		float* Temp = p.at(i);
		delete Temp;
	}
	 p.clear();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -