matlab用双重循环实现费诺编码
1. 费诺编码原理:(百度百科)
https://baike.baidu.com/item/%E8%B4%B9%E8%AF%BA%E7%BC%96%E7%A0%81/6479275
2. 费诺编码实现的编程方向的选择:递归or循环?
- 递归方法实现费诺编码
用递归方法实现费诺编码,逻辑思路无疑是最清晰和最好理解的。
function [y]=fano(大小1Xn的概率矩阵B)
XXXX; %排序,分组,分配0、1码等操作
if(不满足递归返回条件) %递归返回判断
fano(B的子矩阵1); %以靠前的分组为新参数,调用自身
fano(B的子矩阵2); %以靠后的分组为新参数,调用自身
end
end
函数基本的逻辑描述:
求分组概率和a,求前i项累加概率,若大于a/2,分配0/1码à对两个新分组再调用自身。
递归返回条件的讨论:(如何判断某一分支的编码已经完成)
- 前一次分组后,该分组里只有两个元素:分配0、1码,该分支编码结束。
- 前一次分组后,该分组里只有一个元素:该分支编码在上一次分组时就已经结束。
递归编程虽然非常简单直观,便于理解,但是非常的吃内存,而且matlab也不赞成递归,无论是直接的,还是间接的。详见:
(https://ww2.mathworks.cn/help/bugfinder/ref/misrac2012rule17.2.html)
- 如何用循环的方法代替递归实现费诺编码?
只关注概率行向量里的某一个元素的编码,在编码过程中,对之进行”追踪”,得到其费诺编码。同样的过程,对概率行向量里的每个元素都进行一遍,即可得到所有元素的费诺编码。
3. 用双重循环实现费诺编码的过程及步骤
- 最外层循环(对每个概率元素都从头进行一次编码)的设计
- 用一个while循环解决分组内元素数目大于2的情况
- 分组元素数目等于2时,另行处理
(分组内数目数目等于1时,其编码在上一次分组时已经完成,故而不讨论)
- 内层循环的设计
4. 不等长的费诺编码的码字存储问题
- 由于不等长,不能用一个矩阵来存储所有元素的码字
- 由3可知,每次内层循环会分配一个0/1码,所以码字的存储应该是可以扩展的
解决办法:利用matlab的字符向量元胞数组
- 每个元胞对应存储一个码字
- 因为是字符向量,可以进行字符连接操作(和’0’或者’1’连接)
- 每次层循环,添加一个’0’/’1’的操作流程
1. 将元胞字符向量转化为一般字符向量(cell2mat)
char=cell2mat(C);
2. 对转化后的字符向量执行连接’0’或者’1’的操作
char=[char '0'];或者char=[char '1'];
3. 将操作完成后的一般字符向量重新赋给元胞字符向量
C={char};
程序设计思路:
1.参数A为待编码的概率行向量,B为A的降序排序
2.用数组Z来保存B中各个元素所在分组的元素总数(初始值为B的长度)
3.用M、N记录B中当前正在编码的元素所在的分组的起始和终止位置
4.用空的元胞字符向量数组C存放编码的码字(C的长度等于B的长度)
实现代码:
function y=fano_code(A) B=fliplr(A); [m,n]=size(B); M=1; N=n; Z=ones(1,n).*n;for j=1:nC(j)={''}; endfor i=1:nwhile(Z(i)>2)a=sum(B(1,M:N),2)/2;for K=M:Nif sum(B(1,M:K),2)>=aif i<=Kchar=cell2mat(C(i));char=[char '0'];C(i)={char};N=K;Z(i)=N-M+1;break;elsechar=cell2mat(C(i));char=[char '1'];C(i)={char};M=K+1;Z(i)=N-M+1;break;endendendendif Z(i)==2if i==Mchar=cell2mat(C(i));char=[char '0'];C(i)={char};elsechar=cell2mat(C(i));char=[char '1'];C(i)={char};endendM=1;N=n; endcelldisp(C); end
matlab用双重循环实现费诺编码相关推荐
- MATLAB实现费诺编码的计算与分析
一.实验目的 1.理解霍费诺编码的原理. 2.掌握费诺编码的方法和步骤. 3.熟悉费诺编码的效率. 4.本实验用Matlab语言编程实现费诺(Fano)编码. 二.实验环境 windows XP,MA ...
- 用MATLAB实现费诺编码
一.简述 <信息论与编码>是一门理论与实践密切结合的课程,课程设计是其实践性教学环节之一,同时也是对课堂所学理论知识的巩固和补充.其主要目的是加深对理论知识的理解,掌握查阅有关资料的技能, ...
- 费诺码设计matlab,费诺编码的matlab实现.doc
费诺编码的matlab实现.doc 多媒体技术实验报告学院:城南学院 姓名:学号:指导老师:尹波时间:2015年11月25日 教师评语:成绩 评阅教师 日期 实验一:费诺编码的matlab实现1实验目 ...
- java实现.费诺编码_香农费诺编码的matlab实现.doc
香农费诺编码的matlab实现.doc 信息论与编码实验香农费诺编码的matlab实现学院班级-姓名学号摘要 用预先规定的方法将文字.数字或其他对象编成数码,或将信息.数据转换成规定的电脉冲信号.编码 ...
- 香农码字matlab,香农--费诺编码的matlab实现
香农--费诺编码的matlab实现 信息论与编码实验香农 --费诺编码的 matlab 实现学院:------班级:-----姓名:----学号:----摘要:用 预 先 规 定 的 方 法 将 文 ...
- 实例详解Matlab费诺编码
费诺编码(Fano Coding)是一种前缀编码,用于将符号序列压缩并传输.在费诺编码中,频率较高的符号被分配到短的编码而频率较低的符号则被分配到长的编码. 下面是一个用MATLAB实现费诺编码的例子 ...
- 费诺编码的MATLAB递归实现
一.设计目标 实现任意Q符号信源的二进制费诺编码,其中Q>10且由用户自行输入,信源的概率分布也由用户输入.展示编码结果.平均码长.信源熵.编码效率. 二.设计步骤 (1)输入模块:实现对Q和信 ...
- java费诺编码_费诺编码的分析与实现.doc
费诺编码的分析与实现 吉林建筑大学 电气与电子信息工程学院 设计题目: 费诺编码的分析与实现 专业班级: 电子信息工程 111 学生姓名: 马 超 学 号: 指导教师: 吕卅 王超 设计时间: 201 ...
- 信源编码的代码实现 (香农编码、费诺编码、哈夫曼编码、游程编码、算术编码)
文章目录 香农编码 费诺编码 哈夫曼编码 C++版 C语言版 游程编码 算术编码 香农编码 (1) 将信源消息符号按其出现的概率大小依次排列 p1 ≥ p2 ≥ - ≥ pn (2) 确定满足下列不等 ...
最新文章
- 客户端dmesg_打印调试技术 printk klogd dmesg(解决打印信息的问题)
- css3画图那些事(三角形、圆形、梯形等)
- 容器源码分析之ArrayList(二)
- maven 导入数据库
- Bootstrap 打印机类
- 在早上起床后适当的喝一杯白开水
- mysql事务高级_mysql高级 标量 与事务
- 【TSP】基于matlab遗传算法求解旅行商问题【含Matlab源码 1337期】
- java求第几位数字_怎么得到一个数的第n位数字 急求大神帮助
- 音乐播放微信小程序基于node.js后台
- jar转apk专辑 android,jar转apk格式转换器
- js中判断对象数组中是否存在某个对象,以及使用判断是否存在某个元素的indecOf()和find()方法
- 4.1.5 消费者获取记录
- Linux网络编程-UDP单播服务客户端代码实现
- Linux普通用户查看本机域名,域名的解析过程
- 无线工业物联网数据监测终端
- 华为U8150(IDEOS)手机USB驱动安装
- 给screen的会话改名字
- 连续型随机变量与离散型随机变量
- PHP学习----换行符
热门文章
- 江门C语言培训,江门c语言编程学习,江门学c语言编程培训,江门学c语言编程效果怎么样...
- 今天的样子,绝非偶然
- flash mx拖拽实例_集成Flash MX 2004和Director MX 2004
- 最终作业 - 软件工程实践总结(个人)
- linux安装vlc只能命令行启动,Ubuntu安装多功能的媒体播放器VLC播放器的步骤
- 将 confirm的确定取消修改为是否
- Python-群发推广邮件
- 强化学习系列5:有模型的策略迭代方法
- 事务第02讲:数据库事务(MySQL)
- Spring Cloud云架构 - SSO单点登录之OAuth2.0登录认证(1)