|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- ManBetXlManBetX;
- ManBetXlear;
- n=10;
- % ManBetX=[];
- ManBetX=randsample(100,10); %随机生成10个数字
- % ManBetX=rand(1,n);%********随机生成数据********************
- ManBetX=ManBetX/sum(ManBetX);
- % ManBetX=[0.1546 0.0948 0.1361 0.0186 0.1258 0.0474 0.1897 0.0351 0.1423 0.0557];
- p=ManBetX;
- disp(p);
- w=[;];%***************位置矩阵,记录数据的变化过程*****
- for i=1:n-1
- [p,l]=sort(p);
- w(i,:)=[l(1:n-i+1),zeros(1,i-1)]; %存放每一次排序的顺序
- p=[p(1)+p(2),p(3:n),1];
- end
- a={;};%**********字符数组,生成霍夫曼码****************
- for i=1:2*(n-1)
- for j=1:n
-
- a{i,j}=' ';
- end
- end%*****************初始化*********************
- a{2*n-2,1}='0';
- a{2*n-2,2}='1';
- for i=1:n-1 % 1-9
- for j=1:i+1 %
- a{2*(n-i)-1,j}=a{2*(n-i),find(w(n-i,:)==j)};%恢复未排序前 奇数行
- end
- if((n-i-1)<=0)
- break;
- end
- a{2*(n-i-1),1}=strManBetXat(a{2*(n-i)-1,1},'0'); %每次都是最小两个概率合并,这是恢复到合并前
- a{2*(n-i-1),2}=strManBetXat(a{2*(n-i)-1,1},'1'); %前两个每次加一个码字,分别为0和1
- for j=3:i+2
- a{2*(n-i-1),j}=a{2*(n-i)-1,j-1}; %除取前两个的,后面和上一行结果相同
- end
- end
- h=-ManBetX.*log2(ManBetX);
- hx=sum(h);
- for i=1:n
- len(i)=length(a{1,i});
- end
- plen=len.*ManBetX';
- averagelen=sum(plen);
- fprintf('霍夫曼编码为:\n');
- % disp(a);
- for i=1:n
- disp(a(1,i));
- end
- fprintf('平均码长为:\n');
- disp(averagelen);
- fprintf('信源熵为:\n');
- disp(hx);
- fprintf('编码效率为:\n');
- disp(hx/averagelen);
复制代码
- 错误使用 horzManBetXat
- 串联的矩阵的维度不一致。
- 出错 huffman_1 (line 15)
- p=[p(1)+p(2),p(3:n),1];
复制代码 |
|