Matlab实现Huffman编码

Matlab实现Huffman编码代码 function u c e f huff codec A HUFF CODEC 哈夫曼编码的 MATLAB 实现 author Frank 本程序重点在建树和建表过程 以及求解平均码长和编码效率 因为建表的顺序不一致 可能会导致码表不一致 但是都满足熵编码要求 u 输出排序后的频率分布 c 输出码表 e 输出平均码长 f

代码

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编码

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/214465.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午4:12
下一篇 2026年3月18日 下午4:12


相关推荐

  • WSUS客户端访问服务端异常报错-0x8024401f「建议收藏」

    WSUS客户端访问服务端异常报错-0x8024401f「建议收藏」背景:客户反映windows服务器在进行自动更新的时候报错,无法进行更新服务器版本:WindowsServer2012R2StandardIIS版本:8WSUS版本:6.3.9600报错信息:2021-11-2922:15:10:401804cd8WSWARNING:与位于“http://xxxx.xxxx.xxx.xxx:8530/ClientWebService/client.asmx”的终结点进行通信时出现错误。2021-11-…

    2022年6月10日
    61
  • webstrom激活码2021[最新免费获取]「建议收藏」

    (webstrom激活码2021)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月27日
    131
  • 易语言时间戳转时间

    易语言时间戳转时间其实就是一行代码的事 返回类似于 2018 年 8 月 1 日几点几分几秒增减时间 到时间 1970 01 0100 00 00 秒 时间戳

    2026年3月17日
    2
  • Coze智能体如何高效处理批量输入数据?

    Coze智能体如何高效处理批量输入数据?

    2026年3月12日
    2
  • yml文件解析

    yml文件解析yml 文件解析 YamlProperti 测试注意 YamlProperti 在开发过程中 遇到一个 yml 文件解析的功能 随手做个记录 具体要求是这样的 前段传递一个 key 后端通过这个 key 获取配置文件中的 key 对应着值 若是用 properties 文件的话 是比较好获取的 但是 yml 文件的话 通过我的各种尝试 最终用 org springframe

    2026年3月18日
    1
  • 用什么软件写html语言,写html代码用什么软件

    用什么软件写html语言,写html代码用什么软件写html代码的软件:1、SublimeText;2、Dreamweaver;3、WebStorm;4、HBuilder;5、Notepad;6、VSCode;7、Vim;8、AptanaStudio;9、IntelliJIDEA。本教程操作环境:windows7系统、HTML5版、DellG3电脑。1、SublimeTextSublimeText是一个跨平台的代码编辑器,同时支持W…

    2022年5月30日
    62

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号