(Matlab源码)Matlab实现算术编码(Arithmetic coding)超级详解(每一段代码都可以看懂)

2023-10-27

1、代码功能

  • 输入:一个字符串
  • 输出:
    •   codeword(码值)
    •  codeword所占的位数

2、代码框图

3、代码超详解

  •  统计字符串中的字符种类,调用函数,放入数组b中。
b=unique(str1);
  • 统计每种字符的个数,放入数组a中。
for i=1:length(b)
    a(i)=length(strfind(str1,b(i)));
end
  •  排序,形成对应关系的数组。排序后,若数组b中的第一个元素为字符‘a’, 则数组a中的第一个元素为字符‘a’,出现的次数
for i=1:length(a)-1
    for j=i+1:length(a)
        if(a(i)<a(j))
            t1=a(i);
            a(i)=a(j);
            a(j)=t1;
            t2=b(i);
            b(i)=b(j);
            b(j)=t2;
        end
    end
end
  • 统计每种字符出现的频率,放入数组frequency中。
for i=1:length(a)
    frequency(i) = a(i)/sum(a);
end

 根据频率分配概率范围,范围高值放入数组high中,范围低值放入数组low中。

low(1)=0;
for i = 1:length(frequency)
    if i==1
        high(i)=frequency(i);
    else
        low(i)=frequency(i-1)+low(i-1);
        high(i)=low(i)+frequency(i);
    end
end

编码

%编码
low_value=0; %初始化
high_value=1; %初始化
range=high_value-low_value; %初始化
for i = 1:length(str1) %遍历字符串中的每一个元素,使用for循环语句。
    
     d=strfind(b,str1(i)); %找到字符串中的字符,在数组d中的角标
     
     %算术编码
     high_value = low_value+ range*high(d);
     low_value = low_value+range*low(d);
     range=high_value-low_value;
     
     %编码后数据处理
     if i==length(str1)
         ave=(high_value+low_value)/2;
         ave_str=num2str(ave,length(str1)); %把数字转成字符串
         low_value_str=num2str(low_value,length(str1)); %把数字转成字符串
         high_value_str=num2str(high_value,length(str1)); %把数字转成字符串
         
         %当ave_str与low_value_str对应位的元素不一样时
         %截去ave_str不一样元素后面的字符
         for ii= 3: length(low_value_str)
             if low_value_str(ii) ~= high_value_str(ii)
                  ave_str((ii+1):end)=[];
                  break;
             end
             ii=ii+1;           
         end
     end
end

%把ave_str值赋给codeword
codeword=ave_str
%计算codeword占用的位数
bits=-log2(range)

 

  • 整个代码地址

       Matlab实现算术编码

4、代码缺点

  • 这个代码可以实现短字符串的编码,对于长字符串的编码,会出现underflow。如何解决underflow, 这篇博客有专题研究

       算术编码(arithmetic coding)的underflow问题

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(Matlab源码)Matlab实现算术编码(Arithmetic coding)超级详解(每一段代码都可以看懂) 的相关文章

  • 如何使用 MATLAB 的“等值面”函数创建三角球体

    如何创建一个三角球体 其中每个三角形的面面积相同 我想要这样的东西 http imageshack us a img198 5041 71183923 png http imageshack us a img198 5041 7118392
  • Matlab 中是否有相当于 R 的 dput() 的函数?

    Matlab 中是否有相当于 R 的 dput 的函数 dput 将 R 对象的 ASCII 文本表示形式写入文件或连接 UPDATE 1 添加了递归和对单元格的支持 UPDATE 2 添加了对结构的支持 UPDATE 3 增加了对逻辑 整
  • Matlab-如何在曲线上绘制切线

    我在 matlab 中绘制了一个图表 plot x y 我的图表有不同的斜率 我如何在每个斜率上绘制切线并计算斜率的系数 如果您没有用于绘制点的显式函数 您可以使用有限差分 http en wikipedia org wiki Finite
  • 在 Matlab 中保存当前运行的脚本

    有没有办法保存Matlab中当前运行的脚本 我有一个脚本 它会自动备份一组脚本 但如果我更改了当前脚本 则保存的版本将过期 也许可以调用一些java Thanks 在 Yair Altman 网站上的某个地方 请参阅我的其他答案中的链接 他
  • 在 MATLAB 中检索 spfun、cellfun、arrayfun 等中的元素索引

    有什么办法可以找回index调用函数的元素的cellfun arrayfun or spfun行为 即检索函数范围内元素的索引 为了简单起见 假设我有以下玩具示例 S spdiags 1 4 0 4 4 f spfun x 2 x S 它构
  • Matlab:如何显示数组的“真实”值?

    我有一个在脚本中计算的向量 计算后 我将值显示到命令窗口 显示如下 finalResults 1 0e 05 0 0001 0 0 0005 0 0002 0 0001 0 0027 0 0033 0 0001 0 0000 0 0000
  • Matlab PARFOR 循环可以通过编程方式打开/关闭吗?

    有一个关于 MATLAB 中 parfor 的简单问题 我想在程序中设置一个标志 以便在 parfor 和常规 for 循环之间进行更改 基本上 我需要此功能 以便我的代码的某些部分可以在 调试 模式下更新图形 然后当关闭该标志时 使用 p
  • 将自动生成的 Matlab 文档导出为 html

    我想为我开发的 Matlab 工具箱生成完整的帮助 我已经看到如何显示自定义文档 http www mathworks fr fr help matlab matlab prog display custom documentation h
  • MATLAB 滚动图

    我有一个脑电图数据库 我想绘制它 数据库是一个19 1000 134的矩阵 其中 19 是通道数 在第一种方法中 我只使用一个渠道 1000 个样本大小 采样率为 500 Hz 时为 1000 个点 即 2 秒数据 134 epochs的数
  • 在 matlab 中求 3d 峰的体积

    现在我有一个带有峰值的 3D 散点图 我需要找到其体积 我的数据来自图像 因此 x 和 y 值表示 xy 平面上的像素位置 z 值是每个像素的像素值 这是我的散点图 scatter3 x y z 20 z filled 我试图找到数据峰值的
  • 句柄类和值类的区别

    我有一些 C 背景 想使用 Matlab 中的类 句柄和值类有什么区别 我知道如果我想定义一个带有重载运算符 例如 和 的矩阵类 我会使用值类 然而 有时 当我选择一个手柄类时 事情似乎只对我有用 MathWorks 提供了一些有关其用途的
  • 使用 MATLAB 进行线路跟踪

    我有一个图像 我想将其转换为逻辑图像 包括线条为黑色 背景为白色 当然 可以使用阈值方法来实现这一点 但我不想使用这种方式来做到这一点 我想通过使用线路跟踪方法或类似的方法来检测它 这是关于视网膜血管检测的 我找到了一个article ht
  • MATLAB:具有复数的 printmat

    我想使用 MATLAB 的printmat显示带有标签的矩阵 但这不适用于复数 N 5 x rand N 1 y rand N 1 z x 1i y printmat x y z fftdemo N 1 2 3 4 5 x y x iy O
  • 如何将二进制值列表转换为int32类型?

    我在 MATLAB 工作区中有一个小端格式的二进制数列表 我想将它们转换为 int32 a是由 0 和 1 组成的双向量 如下所示 a 0 0 0 1 1 0 0 1 1 1 1 0 1 0 1 0 0 0 0 1 1 0 0 0 1 1
  • 使用符号求解器仅求解某些变量

    我正在尝试在 MATLAB 中求解包含 3 个变量和 5 个常量的方程组 是否可以使用solve求解三个变量 同时保持常量为符号而不用数值替换它们 当您使用SOLVE http www mathworks com access helpde
  • 我需要转义该 MATLAB 字符串中的字符吗?

    我想在 MATLAB 中调用以下 bash 命令 grep Up to test linux vision1 1 log awk print 7 I use system 在MATLAB中 但结果有错误 gt gt status strin
  • 如何告诉 mex 链接到 /usr/lib 中的 libstdc++.so.6 而不是 MATLAB 目录中的 libstdc++.so.6?

    现在 MATLAB 2012a 中的 mex 仅正式支持 gcc 4 4 6 但我想使用 gcc 4 7 风险自负 现在如果我直接用 mex 编译一些东西 它会抱怨 usr lib gcc i686 linux gnu 4 7 cc1plu
  • 黑白随机着色的六角格子

    我正在尝试绘制一个 10 000 x 10 000 随机半黑半白的六边形格子 我不知道如何将该格子的六边形随机填充为黑色和白色 这是我真正想要从这段代码中得到的示例 但我无法做到 https i stack imgur com RkdCw
  • 理解高斯混合模型的概念

    我试图通过阅读在线资源来理解 GMM 我已经使用 K 均值实现了聚类 并且正在了解 GMM 与 K 均值的比较 以下是我的理解 如有错误请指出 GMM 类似于 KNN 在这两种情况下都实现了聚类 但在 GMM 中 每个簇都有自己独立的均值和
  • 如何在 matlab 中创建由多个 3d 图像数据数组组成的数组

    我正在阅读 15 张图片imagedata imread imagename jpg 它的大小总是320 by 320 by 3 如何将数据放入数组中 使用 for for 循环 以便在访问新数组的第一个元素时获得输入的第一个图像的 RGB

随机推荐

  • Linux脚本和环境变量

    目录 一 可执行脚本 二 脚本程序解释器 三 SHELL语言 四 shell语言的变量 1 环境变量 2 用户环境变量 一 可执行脚本 脚本script 是一种解释执行的程序 linux中有三种常见的脚本 Shell脚本 sh Python
  • 第八章 基于项的图形视图

    对于用户自定义的窗口部件和绘制一个或者几个项来说 使用QPainter是理想的 在绘图中 如果需要处理从几个到几万个项时 而且要求用户能够单击拖动选取想 Qt的视图类提供了这一解决方案 Qt的视图体系包括一个由QGraphicsScene充
  • javafx事件总线之EventBus

    JAVAFX EventBus是一个轻量级的事件总线框架 用于在JavaFX应用程序中实现基于事件的通信和解耦 它提供了一种简单的方式 让组件能够订阅和发布事件 从而使得应用程序中的各个组件能够相互通信 而不需要相互依赖 JAVAFX Ev
  • node require报错为936的解决方式之一

    node internal modules cjs loader 936 Error Cannot find module crypto js 1 有一种是 你去检查一下你npm下面的node modules是不是又多了个node modu
  • SQL使用视图的优缺点

    INNER JOIN left Join 联接多个表 关于SQL的执行计划 查看SQL语句的具体执行过程 工作原理 SQL使用视图的优缺点 2010 06 04 10 56 43 分类 SQL 标签 字号大中小 订阅 在做数据库开发中使用视
  • 【华为OD机试题】最低位排序 Java代码实现

    题目描述 给定一个非空数组 列表 起元素数据类型为整型 请按照数组元素十进制最低位从小到大进行排序 十进制最低位相同的元素 相对位置保持不变 当数组元素为负值时 十进制最低为等同于去除符号位后对应十进制值最低位 输入 给定一个非空数组 列表
  • (二十三)槽函数的书写规则导致槽函数触发2次的问题

    在创建QT的信号和槽时 经常无意间保留着QT书写槽函数的习惯 或者在QT设计界面直接右键 转到槽 去创建槽函数 但是后期需要用到disconnect时 又重新写了一遍connect函数 那么你会发现实际槽函数执行了2遍 首先来看下这种QT的
  • JavaScript属性描述符【待补充】

    前言 很多学习过vue的同学 在学习vue响应式数据 或者双向绑定 的原理时 都接触过get set Object defineProperty这句个函数 并且大概知道它们的用法 但是一提到属性描述符 大家就很陌生了 今天详细的给大家讲解一
  • c++11新特性之独占指针unique_ptr

    独占智能指针unique ptr 独占智能指针不允许其他智能指针共享内部的指针 可以通过它的构造函数初始化一个独占智能指针对象 但是不允许通过赋值将一个unique ptr赋值给另一个unique ptr unique ptr不允许复制 但
  • ns2仿真学习(二)-tcp拥塞窗口的跟踪

    本文主要处理 1 的输出结果 仿真脚本 basic1 tcl basic1 tcl simulation A R B Create a simulator object set ns new Simulator Open the nam f
  • Hadoop完全分布式集群搭建(超详细)

    目录 1 1 1 完全分布式介绍 1 1 2 平台软件说明 1 1 3 守护进程布局 1 2 1 集群搭建准备 1 2 2 总纲 1 2 3防火墙关闭 1 2 4 主机映射 1 2 5 免密登陆 1 2 6 jdk安装和hadoop安装及环
  • MySQL优化浅析

    1 场景简介 最近在使用Storm做日志的分析处理 众所周知 Storm是流式的处理框架 也就是每次只能处理和看到一条日志 然而做分析的时候 不可避免的要进行一些统计操作 如统计一分钟内某个ip的访问频率或者某个uid的访问频率等 于是我就
  • jquery html 清除样式,jquery怎么移除css样式

    jquery移除css样式的方法 1 通过使用 removeClass 方法去除css样式 2 通过使用 attr 方法或 css 去除单个css样式 本文操作环境 Windows7系统 jquery3 2 1版 DELL G3电脑 1 使
  • mybatis框架下select带in批量查询,返回结果集顺序与in不一致问题

    mybatis框架下select带in批量查询 返回结果集无序问题
  • 使用mybatis时paramType传入参数总结

    mybatis中SQL接受的参数分为 1 基本类型 2 对象 3 List 4 数组 5 Map 无论传哪种参数给mybatis 他都会将参数放在一个Map中 如果传入基本类型 变量名作为key 变量值作为value 此时生成的map只有一
  • Unhandled exception: Unable to determine ZooKeeper ensemble

    zookeeper hbase开启并正常 但是运行报错 17 04 24 20 13 23 ERROR master HMaster Region server icosa4 60020 1493045002304 reported a f
  • 金蝶,「起舞」在大模型时代

    在过去的几年时间里 基于EBC的平台能力 金蝶已经走出了一个新的进化之路 这条路是对自身产品竞争力的重新构建 也更是对企业数字化转型需求的更大程度满足 如今 苍穹GPT大模型更是让这种竞争力和服务力更向前一步 作者 皮爷 出品 产业家 6个
  • 2016腾旭研发工程师笔试题

    用C C 代码算出满足上述条件的值 我们首先来分析一下 step0 我们可以得到如下方程 step1 由方程 1 3 6 可得 我们可以把x1 x5 x6看成自变量 x2 x8 x7看成对应的函数 这样只要x1 x5 x6确定了 x2 x8
  • 常见的垃圾回收机制总结

    如何工作 在某些 Java 虚拟机中 堆的实现截然不同 它更像一个传送带 每分配一个新对象 它就向前移动一格 这意味着对象存储空间的分配速度特别快 Java 的 堆指针 只是简单地移动到尚未分配的区域 所以它的效率与 C 在栈上分配空间的效
  • (Matlab源码)Matlab实现算术编码(Arithmetic coding)超级详解(每一段代码都可以看懂)

    1 代码功能 输入 一个字符串 输出 codeword 码值 codeword所占的位数 2 代码框图 3 代码超详解 统计字符串中的字符种类 调用函数 放入数组b中 b unique str1 统计每种字符的个数 放入数组a中 for i