matlab 实现霍夫曼编码

编码内容包括:用matlab实现霍夫曼编码,并且求出相应的信源熵,平均码长,和编码效率。

以下是代码:

%霍夫曼编码
%huffman_code
%编码思路:根据位置矩阵的变化过程反推生成霍夫曼编码
n=input('请输入编码个数:\n');
c=[];
% for i=1:n
%     fprintf('请输入第%d个编码:\n',i);
%     c(i)=input('');
% end
c=rand(1,n);%********随机生成数据********************
c=c/sum(c);
p=c;
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
    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}=strcat(a{2*(n-i)-1,1},'0');
    a{2*(n-i-1),2}=strcat(a{2*(n-i)-1,1},'1');
    for j=3:i+2
        a{2*(n-i-1),j}=a{2*(n-i)-1,j-1};
    end
end  
h=-c.*log2(c);
hx=sum(h);
for i=1:n
    len(i)=length(a{1,i});
end
plen=len.*c;
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);

你可能感兴趣的:(matlab 实现霍夫曼编码)