关于信息论与编码的实验

改一下这个代码,就是基本功能都可以实现,但是与之不同。用其他函数或语句实现。

#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;
}