Huffman编码的Matlab实现_信息论基础huffman编码matlab上机作业-程序员宅基地

技术标签: matlab  算法  字符串  Matlab  

Huffman编码的Matlab实现


实现代码

信息论与编码大作业

function [ Huff_chart, Ave_length, yita] = huff_code( c )

%统计字符串中字符出现频率
    t=unique(c);
    for i=1:length(t)
        Num(i)=length(strfind(c,t(i)));
    end
    Num=Num/sum(Num);

%构建Huffman编码表
    Huff_chart=cell(3,length(t));
    for i=1:length(t)
        Huff_chart(1,i)={t(i)};
        Huff_chart(2,i)={Num(i)};
        Huff_chart(3,i)={0};
    end

%生成待编码矩阵,每列最后一个元素为新求和得到元素的位置
    n=length(t);   
    A=sort(Num,'descend');%按降序排列
    T=A;
    A=A/sum(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编码编码格式为:
    %2--->0
    %1--->1
    
    Huff_code=zeros(1,n);
    Huff_code(1,1)=2;
    Huff_code(1,2)=1;
     for i=n-2:-1:1
         t1=Huff_code(B(n,i+1))*10+1;
         t0=Huff_code(B(n,i+1))*10+2;
         Huff_code(B(n,i+1))=[];
         Huff_code(n-i+1)=t1;
         Huff_code(n-i)=t0;
     end
     
%将Huffman编码对应输出到Huffman编码表格中  
    A1=A;
    for i=1:n
        t=find(abs(A-Num(i))<10.^-3);
        t=t(1);
        A(t)=0;
        Huff_chart(3,i)={strrep(num2str(Huff_code(1,t)),'2','0')};
    end
    
%相关计算   
    Ave_length=zeros(1,n);
    for i=1:n
        Ave_length(i)=length(num2str(Huff_code(i)));
    end
    Ave_length=sum(Ave_length.*A1);
    H1=log2(Num);
    H=-Num*(H1');
    yita=H/Ave_length;
    
end
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_43633720/article/details/104075508

智能推荐

基于 SuperMap iObjects C++ 10i(10.2.x)组件在 Visual Studio 2019 上的 Qt 项目开发环境配置_supermap iobjects c++ windows qt-程序员宅基地

文章浏览阅读1.9k次。此文章仅针对 SuperMap iObjects C++ 10.2.0及以上版本在 Visual Studio 2019 上开发 Qt 桌面应用项目的环境配置。由于 SuperMap iObjects C++ 组件结构在版本 10.2.0 进行了更新,导致 CSDN 以前的教程无法完成开发环境的配置工作,若是使用 SuperMap iObjects C++ 10.2.0 之前 版本的组件进行开发,建议参考《SuperMap iObjects for C++ 入门详解(VS + Qt)》教程文档。_supermap iobjects c++ windows qt

网页遮罩层 层次问题[转] 如何让Div层悬浮在Flash Object对象之上!-程序员宅基地

文章浏览阅读87次。让某个图片或者Div层悬浮在别的对象之上,一般的方法是用CSS的z-index来定义。z-index的数值越大,对象越在上面。比如: <div style="position:absolute;z-index=1;">test</div>但是,无论怎么设置z-index,你的对象总是在Object对象下面。要想解决让Div覆盖Flash Object的问题..._flash object层级问题

计算机还硬盘后怎么兼容,电脑升级ssd固态硬盘后为什么还是卡?老电脑升级固态硬盘注意事项详解...-程序员宅基地

文章浏览阅读1k次。使用固态硬盘和机械硬盘的体验是什么:无法察觉的 " 快 " 与难以忍受的 " 慢 ",所以升级固态硬盘对很多配置差的老电脑而言,无疑具有很大的诱惑力。现在问题来了,所有的老电脑都适合升级SSD?答案并非如此,今天脚本之家的小编带大家一起了解老电脑升级固态硬盘注意事项,看完这篇文章,相信你会得到答案。SSD首先,我们先来了解下电脑会越来越卡的原因:1、内存不足,内存处理数据能力差。2、硬盘读写速度慢..._i 5 7400不支持sata3.0

Attention 注意力机制在 NLP 中的应用-程序员宅基地

文章浏览阅读1k次。2020年7月2日,在Facebook AI Research(FAIR) 的联合主办方NeurIPS举行了AI第十四年暑期论坛,由微软亚洲研究院的何泽霖院士、Facebook首席研究科学家王剑锋博士以及Facebook AI Lab的梁聪博士等领头人共同主持,并宣布将于9月11-14日在美国纽约举办AI Meetup。本次论坛邀请了来自微软亚洲研究院、谷歌Brain团队、Facebook AI、百度、清华等知名公司的学者等分享深度学习、图神经网络、强化学习、自然语言处理等前沿AI主题。

oracle_sqlserver和mysql获取表外键的方法,SQLServer数据库之sqlserver查看所有的外键约束...-程序员宅基地

文章浏览阅读478次。本文主要向大家介绍了SQLServer数据库之sqlserver查看所有的外键约束,通过具体的内容向大家展现,希望对大家学习SQLServer数据库有所帮助。1select2a.nameas约束名,3object_name(b.parent_object_id)as外键表,4d.nameas外键列,5object_name(b.referenced_object_id)as..._sqlserver 查询所有表的外键

2021-09-12 Malformed version string ‘~‘: invalid character(s)._malformed version string '~-程序员宅基地

文章浏览阅读4k次。文章目录问题描述解决参考问题描述conda环境中报错Malformed version string ‘~’: invalid character(s).解决更新condaconda upgrade -n base -c defaults --override-channels condaSolving environment: done参考https://stackoverflow.com/questions/56084960/condavalueerror-malformed-vers_malformed version string '~

随便推点

子网掩码的划分和计算详解_子网掩码怎么算-程序员宅基地

文章浏览阅读3w次,点赞49次,收藏365次。一、子网掩码的计算TCP/IP网间网技术产生于大型主流机环境中,它能发展到今天的规模是当初的设计者们始料未及的。网间网规模的迅速扩展对IP地址模式的威胁并不是它不能保证主机地址的唯一性,而是会带来两方面的负担:第一,巨大的网络地址管理开销;第二,网关寻径急剧膨胀。其中第二点尤为突出,寻径表的膨胀不仅会降低网关寻径效率(甚至可能使寻径表溢出,从而造成寻径故障),更重要的是将增加内外部路径刷新时的开销,从而加重网络负担。因此,迫切需要寻求新的技术,以应付网间网规模增长带来的问题。仔细分析发现,网间网规模的增_子网掩码怎么算

IDA attach手机报错:Bogus or irresponsive remote server-程序员宅基地

文章浏览阅读4.1k次。一、使用IDA挂载调试手机报错 :二、解决网上好多都说是SELinux安全策略限制,让关闭linux防火墙,在root权限下操作:setenforce 0试过后,还是不行,在想为什么会:报伪造的或无响应的远程服务器 错误,拿到是没有转发出端口,我又重新看了下转发命令,结果真写错了:adb forward tcp:23946 tc23946应该是:adb forward tcp:23946..._bogus or irresponsive remote server

NodeJS —— Buffer 解读_buffer解引用-程序员宅基地

文章浏览阅读2.9k次。原文出自:https://www.pandashen.comBuffer 概述在 ES6 引入 TypedArray 之前,JavaScript 语言没有读取或操作二进制数据流的机制。 Buffer 类被引入作为 NodeJS API 的一部分,使其可以在 TCP 流或文件系统操作等场景中处理二进制数据流。Buffer 属于 Global 对象,使用时不需引入,且 Buffer 的大小..._buffer解引用

Error:..\FreeRTOS\portable\RVDS\ARM_CM4F\port.c,768-程序员宅基地

文章浏览阅读2.5k次,点赞2次,收藏3次。出现这个报错的时候说明:刚刚发生的中断中调用了系统的API函数,但是该中断的优先级超出了系统可管理的优先级范围;降低该中断的优先级或扩大系统可管理优先级范围即可解决。_error:..\freertos\portable\rvds\arm_cm4f\port.c,768

身份证号正则校验-程序员宅基地

文章浏览阅读4.9k次,点赞2次,收藏10次。正则匹配身份证号 分为18位和15位_身份证号正则校验

LCR 155. 将二叉搜索树转化为排序的双向链表 (二叉搜索树中序遍历)-程序员宅基地

文章浏览阅读300次,点赞10次,收藏3次。除了刚开始,我们让pre右子树(后继)等于root,root的左子树(前驱)等于pre,即完成有序双向链表的建立。对于双向循环列表,你可以将左右孩子指针作为双向循环链表的前驱和后继指针,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。6、最后pre指向最大结点处,我们让pre后继指向head,head前驱指向pre,返回head,完成!2、分别定义一个空的前驱结点pre和一个空的需要返回的头结点head。

推荐文章

热门文章

相关标签