信息论上机实验Word文件下载.docx
- 文档编号:15764139
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:21
- 大小:186.12KB
信息论上机实验Word文件下载.docx
《信息论上机实验Word文件下载.docx》由会员分享,可在线阅读,更多相关《信息论上机实验Word文件下载.docx(21页珍藏版)》请在冰豆网上搜索。
s);
p_i=(float*)calloc(r,sizeof(float));
p_ji=(float**)calloc(r,sizeof(float));
for(i=0;
i<
r;
i++)
p_ji[i]=(float*)calloc(s,sizeof(float));
phi_ij=(float**)calloc(r,sizeof(float*));
i<
i++)
phi_ij[i]=(float*)calloc(s,sizeof(float));
for(j=0;
j<
s;
j++)
fscanf(stdin,"
%f"
p_ji[i][j]);
for(i=0;
{
validate=0.0;
for(j=0;
{
validate+=p_ji[i][j];
}
if(fabs(validate-1.0)>
DELTA)
fprintf(stdout,"
invalidinputdata.\n"
);
exit(-1);
}
fprintf(stdout,"
Starting...\n"
p_i[i]=1.0/(float)r;
C=-MAXFLOAT;
k=0;
sum=(float*)calloc(r,sizeof(float));
do
k++;
for(j=0;
p_j=0.0;
for(i=0;
p_j+=p_i[i]*p_ji[i][j];
if(fabs(p_j)>
=DELTA)
for(i=0;
i<
r;
{
phi_ij[i][j]=p_i[i]*p_ji[i][j]/p_j;
}
else
phi_ij[i][j]=0.0;
p_j=0.0;
for(i=0;
sum[i]=0.0;
for(j=0;
{
if(fabs(phi_ij[i][j])>
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;
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;
Theiterationnumberis%d.\n\n"
k);
Thecapacityofchannelis%.6fbit/symbol.\n\n"
C);
Thebestinputprobabilitydistributionis:
\n"
fprintf(stdout,"
%.6f"
p_i[i]);
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>
free(p_ji[i]);
p_ji[i]=NULL;
free(p_ji);
p_ji=NULL;
free(p_i);
p_i=NULL;
exit(0);
唯一可译码判决准则
iostream.h>
string.h>
structstrings
char*string;
structstrings*next;
};
structstringsFstr,*Fh,*FP;
//输出当前集合
voidoutputstr(strings*str)
{
cout<
<
str->
string<
endl;
str=str->
next;
}while(str);
cout<
inlineintMIN(inta,intb)
{returna>
b?
b:
a;
inlineintMAX(inta,intb)
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->
if(!
strcmp(st_string->
string,code))
return0;
return1;
//判断两个码字是否一个是另一个的前缀,如果是则生成后缀码
voidhouzhui(char*CP,char*tempPtr)
if(!
strcmp(CP,tempPtr))
"
集合C和集合F中有相同码字:
endl
<
CP<
不是唯一可译码码组!
exit
(1);
strncmp(CP,tempPtr,MIN(length_a,length_b)))
{
structstrings*cp_temp;
cp_temp=new(structstrings);
cp_temp->
next=NULL;
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<
MAX(length_a,length_b);
k++)
cp_temp->
string[k-MIN(length_a,length_b)]=longstr[k];
string[abs(length_a-length_b)]=NULL;
//判断新生成的后缀码是否已在集合F里,不在则加入F集合
if(comparing(Fh,cp_temp->
string))
FP->
next=cp_temp;
FP=FP->
voidmain()
//功能提示和程序初始化准备
\t\t唯一可译码的判断!
structstringsCstr,*Ch,*CP,*tempPtr;
Ch=&
Cstr;
CP=Ch;
Fh=&
Fstr;
FP=Fh;
charc[]="
C:
;
Ch->
string=newchar[strlen(c)];
strcpy(Ch->
string,c);
charf[]="
F:
Fh->
string=newchar[strlen(f)];
strcpy(Fh->
string,f);
//输入待检测码的个数
intCnum;
输入待检测码的个数:
cin>
>
Cnum;
输入待检测码"
for(inti=0;
i+1<
:
chartempstr[10];
cin>
tempstr;
CP->
next=new(structstrings);
CP=CP->
string=newchar[strlen(tempstr)];
strcpy(CP->
string,tempstr);
next=NULL;
outputstr(Ch);
while(CP->
next->
tempPtr=CP;
do
tempPtr=tempPtr->
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->
CP=CP->
tempPtr=Fbegin;
for(;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 信息论 上机 实验