信息论实验二:求平均互信息

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

信息论实验二:求英文文本互信息量

实验代码:

#include "stdio.h"

#include "stdlib.h"

#include

void main()

{

FILE *fp;

fp=fopen("1.txt","r");

int l,i=0,j=0;

int p[9999];//用于存放字母

int b,c,add=0;

float num[26]={0},space=0;

float t;

double shang;

float f[26]={0};

float M[27][27]={0},N[27][27]={0};

float total=0;

float Hxy=0;

float s[27]={0};

if(fp==NULL)

int h,k;

{

printf("文件不存在!\n"); exit(0);};

while((l=fgetc(fp))!=EOF)//把字符的ASC码存入数组中

{p[i++]=l;}

for(i=0;p[i]>0;i++)//小写字母和大写字母统一(即不区分大小写)

{if(p[i]>=97)

p[i]=p[i]-32;}

/创建矩阵

for(i=0;p[i]>0;i++)//创建行

{if(p[i]==32)

{int g=p[i+1]; if(g==32){M[0][0]=M[0][0]+1;}

else{g=g-64;M[0][g]++;}}}

for(i=0;p[i]>0;i++)//填满矩阵的其他行{if(p[i]!=32){h=p[i]-64;k=p[i+1];

if(k>0){if(k==32){k=0;}

else {k=k-64;}

M[h][k]=M[h][k]+1;}}}

//求出连续两个字母出现的总数

for(i=0;i<27;i++)

for(j=0;j<27;j++)

{total=total+M[i][j];}

//矩阵复制

for(i=0;i<27;i++)

{for(j=0;j<27;j++){N[i][j]=M[i][j];}} //求条件

for(j=0;j<27;j++)

for(i=0;i<27;i++)

{s[j]=s[j]+M[i][j];}

//求p(xy)

for(i=0;i<27;i++)

for(j=0;j<27;j++)

{M[i][j]=M[i][j]/total;}

//求p(x/y)

for(j=0;j<27;j++)

for(i=0;i<27;i++)

{N[i][j]=N[i][j]/s[j];}

//输出转移矩阵;

printf("转移矩阵为:\n");

for(i=0;i<4;i++){

for(j=0;j<4;j++)

{printf("%f ",N[i][j]);}

printf("\n");};

//求信道疑义度

for(i=0;i<27;i++)

for(j=0;j<27;j++)

{if(N[i][j]!=0)

{M[i][j]=M[i][j]*log(1/N[i][j]);

}} Array //信道疑义度

for(i=0;i<27;i++)

for(j=0;j<27;j++)

{Hxy=Hxy+M[i][j];}

printf("信道损失熵为:\n");

printf("%f",Hxy);

printf("\n");

printf("\n");

//计算熵

fp=fopen("1.txt","r");

if(fp==NULL){

printf("该文件不存在!\n"); exit(0);};

while((c=fgetc(fp))!=EOF){

if(c>='a'&&c<='z')

num[c-97]++;

else if(c>='A'&&c<='Z')

num[c-'A']++;

if(c==32){

space++;};}

t=0;shang=0;

for(i=0;i<=25;i++)

t=t+num[i];

t+=space;

printf("各字母的概率为:\n");

for(i=0;i<=25;i++){

f[i]=num[i]/t;

if(f[i]!=0)

printf("P(%c)=%f\n",97+i,f[i]);}

float ps;

printf("space=%f\n",ps=space/t);

for(i=0;i<=25;i++){

if(f[i]!=0)shang=shang-f[i]*log(f[i]);}

if(ps!=0)

shang-=ps*log(ps);

printf("\n信息熵为:\n%f",shang);

fclose(fp);

printf("\n");

float I;

I=shang-Hxy;

printf("\n");

printf("平均互信息为:\n");

printf("%f\n",I);

printf("\n");} _________________End_________________

相关文档
最新文档