信息论实验信息熵函数的计算
信息熵函数的计算
一. 实验目的任选C语言,C++,或MATLAB等一种语言编写程序,计算信息熵、条件熵、联合熵,并通过1~2个运行的结果,验证程序的正确性。
通过编程实现信息论的一些基本计算,熟悉和理解信息论基本概念。二. 实验内容编写程序实现:
输入:信源分布,信道转移概率矩阵
其中;
输出:信源熵,条件熵,联合熵。三. 实验方案或步骤(程序设计说明)实验选用C语言编程,用一维数组存储信源分布数据,二维数组存储信道转移概率矩阵。利用循环(嵌套)语句计算以下公式并输出需要的结果:
,
,四. 实验程序(经调试正确的源程序#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#define M 20//最大行数
#define N 20//最大列数
/*求以2为底x为顶的对数*/
float log2(float x)
{return log(x)/log(2);}//log2(x)
/*主函数*/
void main()
{int m,n,i,j;
float H_X,H_X_Y,H_Y_X,H_XY;//H(X),H(X|Y),H(Y|X),H(XY)
float P_X_Y,P_Y_X,P_XY;//P(X|Y),P(Y|X),P(XY)
float P_X[M],P_Y[N],matrix[M][N];//信源分布P(X),P(Y),信道转移概率矩阵
while(1)
{
printf("\n请输入信源分布的元素个数 m:");
scanf("%d",&m);
printf("\n输入信源分布:");
for(i=0;i
scanf("%f",&P_X[i]);
printf("\n输入的信源分布为:");
for(i=0;i
printf("%10f",P_X[i]);
printf("\n\n请输入信道转移概率矩阵列数 n:");
scanf("%d",&n);
printf("\n请按行序输入矩阵元素:");
for(i=0;i
for(j=0;j
scanf("%f",&matrix[i][j]);
printf("\n输入的矩阵为:");
for(i=0;i
{printf("\n");
for(j=0;j
printf("%10f",matrix[i][j]);}
//信息熵H(X)
H_X=0;
for(i=0;i
H_X=H_X-P_X[i]*log2(P_X[i]);
printf("\n\n信息熵H(X)=%f",H_X);//信息熵H(X)
//条件熵H(X|Y)
H_X_Y=0;
for(j=0;j
{P_Y[j]=0;
for(i=0;i
{P_Y_X=matrix[i][j];
P_XY=P_Y_X*P_X[i];
P_Y[j]=P_Y[j]+P_XY;}
}
for(i=0;i
{for(j=0;j
{P_Y_X=matrix[i][j];
P_XY=P_Y_X*P_X[i];
P_X_Y=P_XY/P_Y[j];
H_X_Y=H_X_Y-P_XY*log2(P_X_Y);}
}
printf("\n\n条件熵H(X|Y)=%f",H_X_Y);//条件熵H(X|Y)
//条件熵H(Y|X)
H_Y_X=0;
for(i=0;i
{for(j=0;j
{P_Y_X=matrix[i][j];
P_XY=P_Y_X*P_X[i];
H_Y_X=H_Y_X-P_XY*log2(P_Y_X);}
}
printf("\n\n条件熵H(Y|X)=%f",H_Y_X);//条件熵H(Y|X)
//联合熵H(XY)
H_XY=H_X+H_Y_X;
printf("\n\n联合熵H(XY)=%f",H_XY);//联合熵H(XY)
}
}五.程序运行
wilyes11收集 博客(与学习无关):/u/1810231802