信息论编码实验3~9连载,更多看专栏。

哈夫曼编码MATLAB实现

  • 一、哈夫曼编码的原理
  • 二、哈夫曼编码的实例
  • 三、代码及运行结果
    • 3.1根据原理自编程序
    • 3.2利用MATLAB内嵌函数
  • 四、程序自评价

一、哈夫曼编码的原理

哈夫曼编码是一种变字长编码,可以使得编码的平均码长很接近信息熵的编码。基本思想就是,出现概率大的符号编码短一点(码长小),出现概率小的符号才用更多的码来表示。

编码步骤:

  1. 将所有符号按照出现概率大小降序排列;
  2. 从概率最小的两个符号开始,分别配以0和1两种码元(注意顺序会影响编码结果,也可以反过来)。然后将这两个符号概率相加继续和未编码的符号进行码元分配。
  3. 按照码元分配顺序,像这样从下往上,直到分配到第一行符号(概率最大,也必然为0)。
  4. 最后,从上往下读取编码后的结果,即为哈夫曼编码。

二、哈夫曼编码的实例

正好就按照实验指导书的例题来说吧。
假设有六个符号,符号概率依次为[0.21 0.1 0.3 0.09 0.25 0.05],要进行哈夫曼编码,先降序排序,结果展示如下:
我选择的顺序是每次进行码元分配是,上面是0下面是1,当然也可以反过来(得到另一种正确的编码结果)。从x4x6开始,一点一点向上分配码元。直到分配完成后,按照箭头方向进行回溯,即可得到哈夫曼编码。

三、代码及运行结果

3.1根据原理自编程序

那接下来,终于到了开心的写代码环节了。
在编码过程中,比较麻烦的一点在于程序要最后根据箭头方向回溯,所以每一次进行码元分配都要进行映射,所以关键在于映射矩阵reflect的设置(我自己取了这个名字)。

%% 实验四:哈夫曼编码仿真实现
clear all
clc
% 用户输入符号概率
p = input('请输入离散信源概率分布,例如[0.5,0.5]:\n');
N = length(p);% 将概率排序并获得单步码字排序
code = strings(N-1,N);% 初始化单步过程的码字
reflect = zeros(N-1,N);% 初始化位置对应向量
p_SD = p;% p_SD为每次得到的概率排序数组
for i=1:N-1           % i表示排序后第几个符号M = length(p_SD);[p_SD,reflect(i,1:M)] = sort(p_SD,'descend');% 将概率从大到小进行排序code(i,M) = '1';% 概率最小的是1code(i,M-1) = '0';% 概率第二小的暂且定义为0p_SD(M-1) = p_SD(M-1)+p_SD(M);% 将最后两个概率相加p_SD(M)=[];
end% 根据位置对应向量和单步过程的码字计算对应码字
CODE = strings(1,N); % 初始化对应码字
for i=1:Ncolumn = i;for m=1:N-1[row,column] = find(reflect(m,:)==column);CODE(1,i) = strcat(CODE(1,i),code(m,column));% 将最小的两个概率映射成一个if column==N+1-mcolumn = column-1;endend
end
CODE = reverse(CODE);% 计算平均码长
for i=1:NL(i) = size(char(CODE(1,i)),2);
end
L_ave = sum(L.*p);
H = sum(-p.*log2(p));   % 计算信源信息熵
yita = H/L_ave;         % 计算编码效率% 展示输出码字、平均码长和编码效率
disp(['信号符号  ',num2str(1:N)]);
disp(['对应概率  ',num2str(p)]);
disp(['对应码字  ',CODE]);
disp(['平均码长',num2str(L_ave)]);
disp(['编码效率',num2str(yita)]);

输出上面的实例作为参数,运行结果如下:
当然也可以调用映射矩阵reflect出来看一下:

3.2利用MATLAB内嵌函数

没错,虽然上面搞了这么多,但其实MATLAB有哈夫曼编码的内嵌函数。它就是 huffmandict
huffmandict函数:
输入:

  1. 符号symbols
  2. 各符号对应概率p

输出:

  1. 哈夫曼编码码字及对应符号dict(一个两行的元胞矩阵)
  2. 平均码长L_ave
%% 实验四:哈夫曼编码仿真实现-使用内嵌函数
clear all
clc
% 用户输入符号概率
p = input('请输入离散信源概率分布,例如[0.5,0.5]:\n');
N = length(p);symbols = cell(1,N);
for i=1:N         % i表示第几个符号symbols{i} = ['x',num2str(i)];
end
[dict,L_ave] = huffmandict(symbols,p);
dict = dict.';
H = sum(-p.*log2(p));% 计算信源信息熵
yita = H/L_ave;      % 计算编码效率CODE = strings(1,N); % 初始化对应码字
for i=1:N            % i表示第几个符号CODE(i) = num2str(dict{2,i});
end% 展示输出码字、平均码长和编码效率
fprintf('\n运行结果:\n');
disp('信源符号:');disp(dict(1,1:N));
disp(['对应概率:',num2str(p)]);
disp('对应码字:');disp(CODE);
disp(['平均码长:',num2str(L_ave)]);
disp(['编码效率:',num2str(yita)]);

输出结果:

四、程序自评价

还是关于控制台输出结果的问题,由于我太懒了,所以这个实验三遗留的问题就这样吧。反正已经 get 到 Huffman 了,嘿嘿~

另外,从鲁棒性考虑,我没用写当出现用户输入概率和不为1等异常情况解决的代码,所以本程序很脆弱,如果大家用到我的程序可以考虑改进一下~

代码原创,但因为原理编写参考到了实验课的指导书,假如有什么不对的地方,侵删。

实验四-哈夫曼编码的MATLAB实现相关推荐

  1. 蓝桥哈夫曼树C语言,实验四 哈夫曼树及哈夫曼编码

    实验目的## 掌握哈夫曼树的概念.哈夫曼编码及其应用. 掌握生成哈夫曼树的算法. 会用哈夫曼树对传输报文进行编码. 掌握二叉树的二叉链表存储方式及相应操作的实现. ##实验内容## 用哈夫曼编码进行通 ...

  2. c++实验8 哈夫曼编码-译码器

    哈夫曼编码-译码器 此次实验的注释解析多加不少---若对小伙伴们有帮助 希望各位麻烦点个关注 多谢 1.哈夫曼树构造算法为: (1)由给定的n个权值{w1,w2,-,wn}构造n棵只有根结点的二叉树, ...

  3. 霍夫曼编码代码matlab,matlab 实现霍夫曼编码

    编码内容包括:用matlab实现霍夫曼编码,并且求出相应的信源熵,平均码长,和编码效率. 以下是代码: %霍夫曼编码 %huffman_code %编码思路:根据位置矩阵的变化过程反推生成霍夫曼编码 ...

  4. 使用Java实现哈夫曼编码(Huffman Coding)

    文章目录 (一)需求分析 (二)构建哈夫曼树 (三)构建哈夫曼编码 (四)哈夫曼编码的解码 (五)哈夫曼编码压缩的原理 (六)总结 (七)Java代码实现哈夫曼树:构建节点类&二叉树类 (八) ...

  5. MATLAB编程实现哈夫曼编码

    用MATLAB编程实现哈夫曼编码 一.实验目的 理解信源编码的意义 熟悉 MATLAB程序设计: 掌握哈夫曼编码的方法及计算机实现 二.实验原理 统计n个信源消息符号,得到n个不同概率的信息符号 将这 ...

  6. 夫曼编码译码系统课程设计实验报告(含源代码c++_c语言),哈夫曼编码译码系统课程设计实验报告(含源代码C++_C语言)[1]...

    目 录 摘 要 ---------------------------..------ II Abstract ----------------------------..---... II 第一章 ...

  7. (王道408考研数据结构)第五章树-第四节3:哈夫曼树基本概念、构造和哈夫曼编码

    文章目录 一:哈夫曼树基本概念 (1)相关术语 (2)哈夫曼树定义 二:哈夫曼树的构造 三:哈夫曼树特点 四:哈夫曼树典型应用-哈夫曼编码 在计算机中, 文件压缩是一项非常重要的技术,它除了可以减少文 ...

  8. 数据结构实验——哈夫曼编码

    目录 问题描述 基本要求 问题分析 实验代码 运行结果 实验总结 问题描述 利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本.但是,这要求在发送端通过一个编码系统对待传数据 ...

  9. 7-1 哈夫曼编码(实验) 最全代码解析

    给定一段文字,如果我们统计出字母出现的频率,是可以根据哈夫曼算法给出一套编码,使得用此编码压缩原文可以得到最短的编码总长.然而哈夫曼编码并不是唯一的.例如对字符串"aaaxuaxz" ...

最新文章

  1. c++每调用一次函数+1_每个开发人员都应该知道的一些很棒的现代C ++功能
  2. TinyKing的博客园
  3. ssd测试软件cy,目标检测实践_tensorflow版SSD模型测试
  4. mysql decimal(10,2)对应java类型
  5. 【Linux 报错】com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure The las
  6. 使用 scikit-learn 实现多类别及多标签分类算法
  7. 什么时候可以升级HarmonyOS,华为鸿蒙OS即将迎来升级 手机版本或仍需时间
  8. Guavate:桥接Guava和Java8的微型库
  9. 路考步骤七步走 科目三考试一定没问题!
  10. 谷歌开源代码评审规范:好坏代码应该这样来判断
  11. mysql sync es 异步双写_mysql数据同步es方案思考
  12. 剑破冰山—Oracle开发艺术 目录
  13. 华中科技大学计算机考研信息汇总
  14. NYOJ 找球号(二)(哈希表)
  15. Ubuntu 重置登录密码
  16. learnopengl——Specular IBL——貌似读懂了
  17. 阿里sentinel监控客户端配置
  18. 圆周率为什么会等于4?
  19. kobe生涯数据 数据预处理
  20. figma下载_在Figma中将约束与布局网格一起使用

热门文章

  1. access与trunk详细解析+区别
  2. Uaexpert操作手册
  3. 微信小程序官方组件展示之基础内容icon源码
  4. 四平方和定理(拉格朗日定理)
  5. 海思hi3516dv300音频调节总结
  6. 商业银行为什么要更换核心业务系统?
  7. Foreground-aware Pyramid Reconstruction for Alignment-free Occluded Person Re-identification
  8. AlphaFold2源码解析(10)--补充信息1(residue_constants)
  9. LQ_IM68A硅麦测试报告
  10. SpringBoot 异步接口