信息论上机实验.docx

上传人:b****5 文档编号:2853085 上传时间:2022-11-15 格式:DOCX 页数:21 大小:186.12KB
下载 相关 举报
信息论上机实验.docx_第1页
第1页 / 共21页
信息论上机实验.docx_第2页
第2页 / 共21页
信息论上机实验.docx_第3页
第3页 / 共21页
信息论上机实验.docx_第4页
第4页 / 共21页
信息论上机实验.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

信息论上机实验.docx

《信息论上机实验.docx》由会员分享,可在线阅读,更多相关《信息论上机实验.docx(21页珍藏版)》请在冰豆网上搜索。

信息论上机实验.docx

信息论上机实验

信道容量的迭代算法:

#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;i

p_ji[i]=(float*)calloc(s,sizeof(float));

phi_ij=(float**)calloc(r,sizeof(float*));

for(i=0;i

phi_ij[i]=(float*)calloc(s,sizeof(float));

for(i=0;i

for(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;i

p_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;i

p_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;i

phi_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;i

p_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;i

fprintf(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);k

cp_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(;;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1