📄 zbl.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 + -