改一下这个代码,就是基本功能都可以实现,但是与之不同。用其他函数或语句实现。
#include
#include
#include
#include
using namespace std;
#define z 26
int main()
{
int max=0x3f3f3f3f;
ifstream infile;
infile.open("C:\\Users\\lichao\\Desktop\\1.txt");
if(!infile)
{
cout << "Unable to open file";
exit(1);
}
int alphabet_num[z] = {0};
int alphabet_sum = 0;
string s;
while (getline(infile,s))
{
for (int n=0;n='A'&&s[n]<='Z')
{
alphabet_num[s[n]-'A']++;
alphabet_sum++;
}
else if (s[n]>='a'&&s[n]<='z')
{
alphabet_num[s[n]-'a']++;
alphabet_sum++;
}
}
}
float alphabet_prob[z]={0};//计算各字母概率
for (int n=0;n1.0/alphabet_sum;
}
float information[z];//计算字母各信息量
for (int n=0; n0)
{
information[n]=max;
}
else
{
information[n]=-log(alphabet_prob[n])*1.0/log(2);
}
}
float info_entropy=0;//计算英文字母的信源熵
for (int n=0;nPYX[z][z]={0};//存储P(Y|X)矩阵
float PXY[z][z]={0};//计算联合概率
for (int i=0;i1==z)
{
PYX[z-1][0]= 0.5;
PYX[i][j]= 0.5;
}
else
{
PYX[i][j+1]= 0.5;
PYX[i][j]= 0.5;
}
}
for(int i=0;i0; j < z; j++)
{
PXY[i][j] = PYX[i][j] * alphabet_prob[i];
// printf("PXY=%.2f\n ",PXY[i][j]);
}
float PY[z]={0};//计算Y分布概率
for (int i=0;i0;jPY[j]=PY[j]+PXY[i][j];
}
float IYX[z][z]={0};//求I(y|x)矩阵
for (int i=0;i1==z)
{
IYX[z-1][0]=log(1/PYX[z-1][0])/log(2);
IYX[i][j]=log(1/PYX[i][j])/log(2);
}
else
{
IYX[i][j]=log(1/PYX[i][j])/log(2);
IYX[i][j+1]=log(1/PYX[i][j+1])/log(2);
}
}
float HYX=0;//计算损失熵
for(int i=0;i0;jPYX[i][j]!=0)
{
HYX=HYX+PXY[i][j]*(IYX[i][j]);
}
}
float HY=0;//计算Y信息熵
for(int i=0;iPY[i]!=0)
{
HY=HY+PY[i]*(log(1/PY[i])/log(2));
}
float IXY =HY-HYX;//计算平均互信息
printf("字母 概率 信息量\n");
for (int n=0; n'a'+n;
cout << c << " ";
printf("%.3f ",alphabet_prob[n]);
printf("%.3f\n",information[n]);
}
printf(" 信息熵H(X)=%.4f\n ",info_entropy);
printf("H(Y|X)=%.2f\n ",HYX);
printf("H(Y)=%.4f\n ",HY);
printf("平均互信息I(X;Y)=%.4f ", IXY);
infile.close();
return 0;
}