实验二 互信息计算
信科
1实验目
进步熟悉互信息计算
熟练掌握编程语言字符处理程序设计调试技术
2实验求
已知:信源符号英文字母(区分写)空格
输入:篇英文信源文档
输出:列出两字母间互信息计算均互信息
基思想
读入英文字符分两次读入
第次读入计算字符信息熵第二次读入计算信道疑义度
计算均互信息时读入英文字符转化应ASCII码存入数组中
定义矩阵存放前两字母出现次数数组做循环p[i]指前字符p[i+1]指字符移动位矩阵元素加1直数组循环完复制矩阵分求出联合概率条件概率两矩阵应元素相矩阵元素累加信道疑义度熵减信道疑义度均互信息
英文字符
Each of us has such a bankIt's name is TIMEEvery morningTIME creditsyou with 86400 secondsEvery night it writes over no balances It allows no overdraftEach day it opens a new account for youEach night it burns the remains of the dayIf you fail to use the day's depositstge loss is yoursThere is no going backThere is no drawing against the tomorrowYou must live in the present on today's depositsInvest it so as to get from it the utmost in healthhappiness and successThe clock is runningMake the most of today
#include stdioh
#include stdlibh
#include
void main()
{
FILE *fp
fpfopen(filetxtr)
int di0j0
int p[1000]存放字母
int bcadd0
float num[26]{0}space0
float t
double shang
float f[26]{0}
float M[27][27]{0}N[27][27]{0}
if(fpNULL)
{
printf(开文件\n) exit(0)
}
while((dfgetc(fp))EOF)字符ASC码存入数组中
{
p[i++]d
}
for(i0p[i]>0i++)写字母转化成写字母
{
if(p[i]>97)
p[i]p[i]32
}
printf(字符ASC码\n)
for(int a0p[a]>0a++)
{
printf(d p[a])
}
printf(\n)
p填入矩阵M中
for(i0p[i]>0i++)填满矩阵M第行
{
if(p[i]32)
{
int gp[i+1]
if(g32)
{
M[0][0]M[0][0]+1
}
else
{
gg64
M[0][g]++
}
}
}
for(i0p[i]>0i++)填满矩阵行
{
if(p[i]32)
{
int hk
hp[i]64
kp[i+1]
if(k>0)
{
if(k32)
{k0}
else
{kk64}
M[h][k]M[h][k]+1
}
}
}
求出连续两字母出现总数
float total0
for(i0i<27i++)
for(j0j<27j++)
{
totaltotal+M[i][j]
}
矩阵复制
for(i0i<27i++)
{
for(j0j<27j++)
{
N[i][j]M[i][j]
}
}
求条件
float s[27]{0}
for(j0j<27j++)
for(i0i<27i++)
{
s[j]s[j]+M[i][j]
}
求p(xy)存储M[27][27]中
for(i0i<27i++)
for(j0j<27j++)
{
M[i][j]M[i][j]total
}
求p(xy)存储N[27][27]中
for(j0j<27j++)
for(i0i<27i++)
{
N[i][j]N[i][j]s[j]
}
* for(i0i<4i++)矩阵输出
{
for(j0j<4j++)
{
printf(f N[i][j])
}
printf(\n)
}*
求信道疑义度
for(i0i<27i++)
for(j0j<27j++)
{
if(N[i][j]0)
{
M[i][j]M[i][j]*log(1N[i][j])
}
}
信道疑义度
float Hxy0
for(i0i<27i++)
for(j0j<27j++)
{
HxyHxy+M[i][j]
}
printf(信道疑义度\n)
printf(fHxy)
printf(\n)
printf(\n)
计算熵
fpfopen(filetxtr)
if(fpNULL)
{
printf(开文件\n) exit(0)
}
while((cfgetc(fp))EOF)
{
if(c>'a'&&c<'z')
num[c97]++
else if(c>'A'&&c<'Z')
num[c'A']++
if(c32)
{
space++
}
}
t0shang0
for(i0i<25i++)
tt+num[i]
t+space
printf(字母概率\n)
for(i0i<25i++)
{
f[i]num[i]t
if(f[i]0)
printf(cf 97+if[i])
}
float ps
printf(space f\npsspacet)
for(i0i<25i++)
{
if(f[i]0)shangshangf[i]*log(f[i])
}
if(ps0)
shangps*log(ps)
printf(\n信息熵fshang)
fclose(fp)
printf(\n)
float I
IshangHxy
printf(\n)
printf(均互信息I(XY)\n)
printf(f\nI)
printf(\n)
}
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档