MATLAB做的信息论与编码的实验一小部分 结果编码是数字数组,还可计算平均码长,编码效率,编码后信息传输速率 话不多说,直接代码
function [W,L,q,r]=huffman(P) %哈夫曼编码 n=length(P); p=P; mark=zeros(n-1,n); for i=1:n-1 [p,num]=sort(p); mark(i,:)=[num(1:n-i+1),zeros(1,i-1)]; p=[p(1)+p(2),p(3:n),1]; end for i=1:n-1 table(i,:)=blanks(n*n); end table(n-1,n)='1'; table(n-1,2*n)='0'; for i=2:n-1 table(n-i,1:n-1)=table(n-i+1,n*(find(mark(n-i+1,:)==1))-(n-2):n*(find(mark(n-i+1,:)==1))); table(n-i,n)='1'; table(n-i,n+1:2*n-1)=table(n-i,1:n-1); table(n-i,2*n)='0'; for j=1:i-1 table(n-i,(j+1)*n+1:(j+2)*n)=table(n-i+1,n*(find(mark(n-i+1,:)==j+1)-1)+1:n*find(mark(n-i+1,:)==j+1)); end end for i=1:n W(i,1:n)=table(1,n*(find(mark(1,:)==i)-1)+1:find(mark(1,:)==i)*n); l(i)=length(find(abs(W(i,:))~=32)); end L=sum(P.*l); sum1=0; for i=1:n %使用for循环进行信息熵、平均码长求解 a(i)=-log2(P(i)); %a(i)表示单个信源的自信息量 K(i)=ceil(a(i)); %K(i)表示对自信息量向上取整 c(i)=a(i)*P(i); sum1=sum1+c(i); %信息熵 end H=sum1; r=H/L; q=H/L; [m,n]=size(W); W=reshape(W',1,m*n); W=double(W)-double('0') W(find(W==-16))=[]; s1 = 'Huffman 编码所得码字 W:'; s2=' Huffman 编码的平均码字长度L:'; s3=' Huffman 编码的编码效率 Q:'; s4='Huffman 编码后信息传输速率 R:'; disp(s1),disp(W); disp(s2),disp(L); disp(s3),disp(q); disp(s4),disp(r);上面是哈夫曼的编码函数,在主程序里面,直接调用就行
[w,l,q,r]=huffman(S);%w为编码,L为平均长度,q为编码效率,r编码后信息传输速率最后显示一下结果 用到的离散无记忆信源S=[0.4,0.2,0.2,0.1,0.1];%离散无记忆信源
Huffman 编码所得码字 W: 1 0 0 0 0 1 0 0 1 1 0 0 1 0 Huffman 编码的平均码字长度L: 2.2000 Huffman 编码的编码效率 Q: 0.9645 Huffman 编码后信息传输速率 R: 0.9645我没写单位,要加的话在函数中每一行disp后面再加一个disp就行 算了,我加上吧
disp(s1),disp(W); disp(s2),disp(L,'(bit/sign)'); disp(s3),disp(q); disp(s4),disp(r,'(bit/CodeSign)');