霍夫曼编码的matlab实现

霍夫曼编码的原理已经有很优秀的介绍博客了,给出现频率高的灰度级分配更短的码字无非就是利用数学中逆序乘积和最小的原理,具体的原理介绍我就不再赘述了。这里给大家分享一下我个人早先实现的霍夫曼编码matlab程序。废话不多说,直接上代码:

clear all;clc;
q=[0.04 0.05 0.06 0.07 0.10 0.10 0.18 0.40];
n=length(q);
r=zeros(n,n);
rq=zeros(n,n);
for i=1:n
    rq(i,:)=q;
    [q,index]=sort(q);
    r(i,:)=[index(1:n+1-i) zeros(1,i-1)];
    q=[q(1)+q(2) q(3:n) 1];
end
c=cell(n,n);
for i=1:n
    for j=1:n
        c(i,j)={blanks(1)};
    end
end
for row=n:-1:2
    for col=1:n+1-row
        if r(row,col)==1
           c(row-1,1)={[char(c(row,col)), '0']};
           c(row-1,2)={[char(c(row,col)), '1']};
        else
           c(row-1,r(row,col)+1)=c(row,col);
        end
    end
end

代码很短,但是该有的功能都实现了。其中rq用来记录向前迭代的各阶段中的数据值,如fig1所示;r用来记录各阶段的排序结果,如fig2所示;c用来记录反向追溯数据来源过程中的编码值(从下往上看)。

fig1. 记录各阶段数据值的rq
fig2. 记录各阶段排序结果的r

 

fig3. 记录各阶段编码值的c
  • 16
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值