1、信息论上机实验信道容量的迭代算法:#include #include #include #include #include #define DELTA 1e-6 /*delta 阈值*/float log2(float x) return log(x)/log(2);int main(void) register int i,j; register int k; int r,s; float *p_i = NULL; float *p_ji = NULL; float *phi_ij = NULL; float C,C_pre,validate; float *sum = NULL; floa
2、t p_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;ir;i+) p_jii = (float *)calloc(s,sizeof(float); phi_ij = (float *)calloc(r,sizeof(float *); for(i = 0; ir; i+) phi_iji = (float *)calloc(s,sizeof(float); for(i
3、= 0; ir;i+) for(j = 0; js; j+) fscanf(stdin,%f,&p_jiij); for( i = 0; ir; i+) validate = 0.0; for( j = 0; jDELTA) fprintf(stdout,invalid input data.n); exit(-1); fprintf(stdout,Starting. n); for(i = 0; ir; i+) p_ii = 1.0/(float)r; C = -MAXFLOAT; k=0; sum = (float*)calloc(r,sizeof(float); do k+; for(j
4、=0; js; j+) p_j = 0.0; for(i=0;i=DELTA) for(i = 0; i r; i+) phi_ijij = p_ii*p_jiij/p_j; else for(i = 0; ir; i+) phi_ijij = 0.0; p_j = 0.0; for(i = 0; ir; i+) sumi=0.0; for(j=0; j=DELTA) sumi+=p_jiij*log2(phi_ijij)/log2(2.0); sumi=pow(2.0,sumi); p_j += sumi; for(i=0;iDELTA); free(sum); sum = NULL; fp
5、rintf(stdout,The iteration number is %d.nn,k); fprintf(stdout,The capacity of channel is %.6f bit/symbol.nn,C); fprintf(stdout,The best input probability distribution is:n); for(i = 0; i=0;i-) free(phi_iji); phi_iji = NULL; free(phi_ij); phi_ij = NULL; for(i = r-1; i=0;i-) free(p_jii); p_jii = NULL;
6、 free(p_ji); p_ji = NULL; free(p_i); p_i = NULL; free(p_i); p_i = NULL; exit(0);唯一可译码判决准则#include #include #include struct stringschar *string; struct strings *next;struct strings Fstr, *Fh, *FP;/输出当前集合void outputstr(strings *str) do coutstringnext; while(str); coutb?b:a; inline int MAX(int a, int b
7、) return ab?a:b; #define length_a (strlen(CP)#define length_b (strlen(tempPtr)/判断一个码是否在一个码集合中,在则返回0,不在返回1int comparing(strings *st_string,char *code) while(st_string-next) st_string=st_string-next; if(!strcmp(st_string-string,code) return 0; return 1;/判断两个码字是否一个是另一个的前缀,如果是则生成后缀码void houzhui(char *CP
8、,char *tempPtr) if (!strcmp(CP,tempPtr) cout集合C和集合F中有相同码字:endl CPendl 不是唯一可译码码组!next=NULL; cp_temp-string=new charabs(length_a-length_b)+1; char *longstr; longstr=(length_alength_b ? CP : tempPtr);/将长度长的码赋给longstr/取出后缀 for (int k=MIN(length_a,length_b); kstringk - MIN(length_a,length_b)=longstrk; cp
9、_temp-stringabs(length_a-length_b)=NULL; /判断新生成的后缀码是否已在集合F里,不在则加入F集合 if(comparing(Fh,cp_temp-string) FP-next=cp_temp; FP=FP-next; void main()/功能提示和程序初始化准备 couttt唯一可译码的判断!nstring=new charstrlen(c); strcpy(Ch-string, c); Ch-next=NULL; char f=F :; Fh-string=new charstrlen(f); strcpy(Fh-string, f); Fh-n
10、ext=NULL;/输入待检测码的个数 int Cnum; coutCnum; cout输入待检测码endl; for(int i=0; iCnum; i+) couti+1tempstr; CP-next=new (struct strings); CP=CP-next; CP-string=new charstrlen(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); struct strings *Fbegin,*Fend; Fend=Fh; while(1) if(Fend = FP) cout是唯一可译码码组!next) CP=CP-next; tempPtr=Fbegin; for(;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1