实验二互信息的计算实验二互信息的计算信科1.实验目的进一步熟悉互信息的计算熟练掌握编程语言字符处理程序的设计和调试技术2.实验要求已知:信源符号为英文字母(不区分大小写)和空格。输入:一篇英文的信源文档。输出:列出每两个字母之间的互信息并计算平均互信息。基本思想读入英文字符,分两次读入第一次读入计算字符信息熵,第二次读入计算信道疑义度。计算平均互信息时,把读入的每个英文字符转化为对应的ASCII码,存入数组中。定义一个矩阵,用于存放前后两个字母出现的次数。对数组做循环,p[i]指向前一个字符,p[i+1]指向后个字符,每向后移动一位,把矩阵的元素加1,直至把数组循环完。复制一个矩阵,分别求出联合概率和条件概率,把两个矩阵对应的元素相乘,把矩阵元素累加,即得信道疑义度。用熵减去信道疑义度,即得平均互信息。英文字符Eachofushassuchabank.It'snameis“TIME“.Everymorning,TIMEcreditsyouwith86400seconds.Everynightitwritesovernobalances.Itallowsnooverdraft.Eachdayitopensanewaccountforyou.Eachnightitburnstheremainsoftheday.Ifyoufailtousetheday'sdeposits,tgelossisyours.Thereisnogoingback.Thereisnodrawingagainstthe“tomorrow“.Youmustliveinthepresentontoday'sdeposits.Investitsoastogetfromittheutmostinhealth,happinessandsuccess!Theclockisrunning.Makethemostoftoday.#include“stdio.h“#include“stdlib.h“#includevoidmain(){FILE*fp;此资料由网络收集而来,如有侵权请告知上传者立即删除。资料共分享,我们负责传递知识。fp=fopen(“file.txt“,“r“);intd,i=0,j=0;intp[1000];//用于存放字母intb,c,add=0;floatnum[26]={0},space=0;floatt;doubleshang;floatf[26]={0};floatM[27][27]={0},N[27][27]={0};if(fp==NULL){printf(“不能打开文件\n“);exit(0);};while((d=fgetc(fp))!=EOF)//把字符的ASC码存入数组中{p[i++]=d;}for(i=0;p[i]>0;i++)//把小写字母转化成大写字母{if(p[i]>=97)p[i]=p[i]-32;}printf(“字符的ASC码为:\n“);for(inta=0;p[a]>0;a++){printf(“%d“,p[a]);}printf(“\n“);//把p填入矩阵M中for(i=0;p[i]>0;i++)//填满矩阵M第一行{if(p[i]==32){intg=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){inth,k;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;}}}//求出连续两个字母出现的总数floattotal=0;for(i=0;i='a'&&c='A'&&c此资料由网络收集而来,如有侵权请告知上传者立即删除。资料共分享,我们负责传递知识。