Matlab实现Huffman编码

本文介绍了一种使用MATLAB实现哈夫曼编码的方法,包括建立哈夫曼树、生成码表、计算平均码长及编码效率等关键步骤。通过具体示例展示了如何运用此算法进行熵编码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码

function [ u, c, e, f] = huff_codec( A )
%HUFF_CODEC 哈夫曼编码的MATLAB实现
%    author==Frank
%    本程序重点在建树和建表过程,以及求解平均码长和编码效率
%    因为建表的顺序不一致,可能会导致码表不一致,但是都满足熵编码要求
%u   输出排序后的频率分布
%c   输出码表
%e   输出平均码长
%f   输出编码效率 平均码长/熵

%A   输入的原始频率分布,为行向量eg A=[1,2,3,4,5]
    A=sort(A,'descend');%按降序排列
    T=A;u=A;
    A=A/sum(A);
    [~,n]=size(A);

    %生成待编码矩阵,每列最后一个元素为特殊元素的位置
    B=zeros(n,n);
    for i=1:n
        B(i,1)=T(i);%生成编码表的第一列
    end
    r=B(i,1)+B(i-1,1);%最后两个元素相加
    T(n-1)=r;T(n)=0;
    T=sort(T,'descend');
    t=n-1;
    for j=2:n%生成编码表的其他各列
        for i=1:t
            B(i,j)=T(i);
        end
        if t>1
            K=find(T==r);
            B(n,j)=K(end);%从第二列开始,每列的最后一个元素记录特征元素在该列的位置
            r=(B(t-1,j)+B(t,j));%最后两个元素相加
            T(t-1)=r;
            T(t)=0;
            T=sort(T,'descend');
            t=t-1;
        else
            B(n,j)=1;
        end
    end

    %生成Huffman码字矩阵和排序后元素的码表向量
    m=3;s1=sym('[2,1]');s2=s1;%码表,用1表示0,2表示1,因为0会因为被省略导致无法记录
    %这里意思是从倒数第三列开始建表,因为最后一列和倒数第二列的情况我们可以直接推出。
    for i=n-2:-1:1
        p=B(n,i+1);%p是每列保存的特殊元素的位置,特殊元素指的是由上一列最后两个数新合成的数
        if p==1
            s2(1:m-2)=s1(2:m-1);
        elseif p==m
            s2(1:m-2)=s1(1:m-2);
        elseif p==2
            s2(1)=s1(1);
            s2(2:m-2)=s1(3:m-1);
        else
            s2(1:p-1)=s1(1:p-1);
            s2(p+1:m-2)=s1(p+1:m-2);
        end
        s2(m-1)=[char(s1(p)),'2'];
        s2(m)=[char(s1(p)),'1'];
        m=m+1;
        s1=s2;
    end
    L=zeros(1,n);
    for i=1:n
        [~,r]=size(char(s2(i)));
        L(i)=r;
    end

    %将码表转换成0和1输出
    arr=zeros(1,n);
    arr(1:n)=s2(1:n);
    str=[];
    for i=1:n
        s=num2str(arr(i));
        s=strrep(s,'1','0');
        s=strrep(s,'2','1');
        if i==1
            str=s;
        else
            str=[str,' ',s];
        end
    end
    str=regexp(str,' ','split');

    %计算返回值
    c=str;
    e=sum(L.*A);%平均码长 
    H1=log2(A);
    H=-A*(H1');%熵
    f=H/e;%编码效率
end

使用示例

>>p=[1,2,3,4,5,6,7]
>>[ u, c, e, f] = huff_codec( p )

参考

matlab实现huffman编码

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值