1 / 4
文档名称:

数据压缩代码(有注释).doc

格式:doc   大小:21KB   页数:4页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

数据压缩代码(有注释).doc

上传人:gxngqvk 2020/8/30 文件大小:21 KB

下载得到文件列表

数据压缩代码(有注释).doc

相关文档

文档介绍

文档介绍:霍夫曼二元编码%function[h,l]=huffman(p)clear;clc;p=[];%p=[];%测试用数据%检测概率有无数值小于0,小于0时报错if(length(find(p<0))~=0)error('Notaprob,ponent');end%若相加之和减去1不在误差之内,说明超过概率有问题,提示报错,误差为±10e-10;if(abs(sum(p)-1)>10e-10)error('ponentdonotaddto1')endn=length(p);%检测有几个概率事件q=p;m=zeros(n-1,n);%生成0矩阵fori=1:n-1;[q,l]=sort(q);%对q进行升序排序,排序结果存放在q中,元素位置存放在l中。m(i,:)=[l(1:n-i+1),zeros(1,i-1)];%相加后少的那一位位号置0q=[q(1)+q(2),q(3:n),1];%把最小两个概率相加,由于相加后少一位,将该位置1end%生成空矩阵,大小为n*n^2,其中每个码最多占用n个。fori=1:n-1c(i,:)=blanks(n*n);%blanks是空格函数end%以下计算各个元素码字%如m所示,矩阵最后一行的两个非零值先置为1和0。每一位占用7bitc(n-1,n)='1';%c存放编码,开始编码c(n-1,2*n)='0';%先设置第一次的两个分支fori=2:n-1%继续编码%find(m(n-i+1,:)==1),查找位置号为1的元素。%n*(find(m(n-i+1,:)==1))-(n-2):n*(find(m(n-i+1,:)==1));此条语句作用是对应到码字所在的%后四位移到上一行的第一个元素的前四位,所得到的最后一位用于添加1或0c(n-i,1:n-1)=c(n-i+1,n*(find(m(n-i+1,:)==1))-(n-2):n*(find(m(n-i+1,:)==1)));%c(n-i,n)='1';c(n-i,n+1:2*n-1)=c(n-i,1:n-1);c(n-i,2*n)='0';forj=1:i-1%此语句作用是把此次未编码的移到上一行对应位置去c(n-i,(j+1)*n+1:(j+2)*n)=c(n-i+1,n*(find(m(n-i+1,:)==j+1)-1)+1:n*find(m(n-i+1,:)==j+1));endendfori=1:n%将最终的编码存放在h中,ll存放每位编码的长度h(i,1:n)=c(1,n*(find(m(1,:)==i)-1)+1:find(m(1,:)==i)*n);ll(i)=length(find(abs(h(i,:))~=32));%计算最终得到各码的码长。endl=sum(p.*ll);%平均码长H=-sum(p.*log2(p));%显示各参数str=sprintf('信源熵:H=%',H);disp(str);str=sprintf('平均码长为:l=%',l);disp(str);str=sprintf('编码效率:η=%',H/l);disp(str);disp('二元霍夫曼编码为:'),disp(h)霍夫曼三元编码%functi