信息论上机实验.docx
《信息论上机实验.docx》由会员分享,可在线阅读,更多相关《信息论上机实验.docx(21页珍藏版)》请在冰豆网上搜索。
![信息论上机实验.docx](https://file1.bdocx.com/fileroot1/2022-11/15/71f6a9c8-c311-45f2-b596-18f016df1981/71f6a9c8-c311-45f2-b596-18f016df19811.gif)
信息论上机实验
信道容量的迭代算法:
#include
#include
#include
#include
#include
#defineDELTA1e-6/*delta阈值*/
floatlog2(floatx)
{
returnlog(x)/log
(2);
}
intmain(void)
{
registerinti,j;
registerintk;
intr,s;
float*p_i=NULL;
float**p_ji=NULL;
float**phi_ij=NULL;
floatC,C_pre,validate;
float*sum=NULL;
floatp_j;
fscanf(stdin,"%d",&r);
fscanf(stdin,"%d",&s);
p_i=(float*)calloc(r,sizeof(float));
p_ji=(float**)calloc(r,sizeof(float));
for(i=0;ip_ji[i]=(float*)calloc(s,sizeof(float));
phi_ij=(float**)calloc(r,sizeof(float*));
for(i=0;iphi_ij[i]=(float*)calloc(s,sizeof(float));
for(i=0;ifor(j=0;j
fscanf(stdin,"%f",&p_ji[i][j]);
for(i=0;i{
validate=0.0;
for(j=0;j
{
validate+=p_ji[i][j];
}
if(fabs(validate-1.0)>DELTA)
{
fprintf(stdout,"invalidinputdata.\n");
exit(-1);
}
}
fprintf(stdout,"Starting...\n");
for(i=0;ip_i[i]=1.0/(float)r;
C=-MAXFLOAT;
k=0;
sum=(float*)calloc(r,sizeof(float));
do
{
k++;
for(j=0;j
{
p_j=0.0;
for(i=0;ip_j+=p_i[i]*p_ji[i][j];
if(fabs(p_j)>=DELTA)
for(i=0;i{
phi_ij[i][j]=p_i[i]*p_ji[i][j]/p_j;
}
else
for(i=0;iphi_ij[i][j]=0.0;
}
p_j=0.0;
for(i=0;i{
sum[i]=0.0;
for(j=0;j
{
if(fabs(phi_ij[i][j])>=DELTA)
sum[i]+=p_ji[i][j]*log2(phi_ij[i][j])/log2(2.0);
}
sum[i]=pow(2.0,sum[i]);
p_j+=sum[i];
}
for(i=0;ip_i[i]=sum[i]/p_j;
C_pre=C;
C=log2(p_j)/log2(2.0);
}
while(fabs(C-C_pre)/C>DELTA);
free(sum);
sum=NULL;
fprintf(stdout,"Theiterationnumberis%d.\n\n",k);
fprintf(stdout,"Thecapacityofchannelis%.6fbit/symbol.\n\n",C);
fprintf(stdout,"Thebestinputprobabilitydistributionis:
\n");
for(i=0;ifprintf(stdout,"%.6f",p_i[i]);
fprintf(stdout,"\n");
for(i=s-1;i>=0;i--)
{
free(phi_ij[i]);
phi_ij[i]=NULL;
}
free(phi_ij);
phi_ij=NULL;
for(i=r-1;i>=0;i--)
{
free(p_ji[i]);
p_ji[i]=NULL;
}
free(p_ji);
p_ji=NULL;
free(p_i);
p_i=NULL;
free(p_i);
p_i=NULL;
exit(0);
}
唯一可译码判决准则
#include
#include
#include
structstrings
{
char*string;
structstrings*next;
};
structstringsFstr,*Fh,*FP;
//输出当前集合
voidoutputstr(strings*str)
{
do
{
cout<string<str=str->next;
}while(str);
cout<}
inlineintMIN(inta,intb)
{returna>b?
b:
a;}
inlineintMAX(inta,intb)
{returna>b?
a:
b;}
#definelength_a(strlen(CP))
#definelength_b(strlen(tempPtr))
//判断一个码是否在一个码集合中,在则返回0,不在返回1
intcomparing(strings*st_string,char*code)
{
while(st_string->next)
{
st_string=st_string->next;
if(!
strcmp(st_string->string,code))
return0;
}
return1;
}
//判断两个码字是否一个是另一个的前缀,如果是则生成后缀码
voidhouzhui(char*CP,char*tempPtr)
{
if(!
strcmp(CP,tempPtr))
{
cout<<"集合C和集合F中有相同码字:
"<<<<"不是唯一可译码码组!
"<exit
(1);
}
if(!
strncmp(CP,tempPtr,MIN(length_a,length_b)))
{
structstrings*cp_temp;
cp_temp=new(structstrings);
cp_temp->next=NULL;
cp_temp->string=newchar[abs(length_a-length_b)+1];
char*longstr;
longstr=(length_a>length_b?
CP:
tempPtr);//将长度长的码赋给longstr
//取出后缀
for(intk=MIN(length_a,length_b);kcp_temp->string[k-MIN(length_a,length_b)]=longstr[k];
cp_temp->string[abs(length_a-length_b)]=NULL;
//判断新生成的后缀码是否已在集合F里,不在则加入F集合
if(comparing(Fh,cp_temp->string))
{
FP->next=cp_temp;
FP=FP->next;
}
}
}
voidmain()
{
//功能提示和程序初始化准备
cout<<"\t\t唯一可译码的判断!
\n"<structstringsCstr,*Ch,*CP,*tempPtr;
Ch=&Cstr;
CP=Ch;
Fh=&Fstr;
FP=Fh;
charc[]="C:
";
Ch->string=newchar[strlen(c)];
strcpy(Ch->string,c);
Ch->next=NULL;
charf[]="F:
";
Fh->string=newchar[strlen(f)];
strcpy(Fh->string,f);
Fh->next=NULL;
//输入待检测码的个数
intCnum;
cout<<"输入待检测码的个数:
";
cin>>Cnum;
cout<<"输入待检测码"<for(inti=0;i{
cout<
";
chartempstr[10];
cin>>tempstr;
CP->next=new(structstrings);
CP=CP->next;
CP->string=newchar[strlen(tempstr)];
strcpy(CP->string,tempstr);
CP->next=NULL;
}
outputstr(Ch);
CP=Ch;
while(CP->next->next)
{
CP=CP->next;
tempPtr=CP;
do
{
tempPtr=tempPtr->next;
houzhui(CP->string,tempPtr->string);
}while(tempPtr->next);
}
outputstr(Fh);
structstrings*Fbegin,*Fend;
Fend=Fh;
while
(1)
{
if(Fend==FP)
{
cout<<"是唯一可译码码组!
"<exit
(1);
}
Fbegin=Fend;
Fend=FP;
CP=Ch;
while(CP->next)
{
CP=CP->next;
tempPtr=Fbegin;
for(;;