我是靠谱客的博主 完美百褶裙,最近开发中收集的这篇文章主要介绍实验五-LZW编码的MATLAB实现一、LZW编码原理介绍二、LZW编码实例三、代码展示及运行结果四、程序自评价,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
信息论编码实验3~9连载,更多看专栏。
LZW编码的MATLAB仿真实现
- 一、LZW编码原理介绍
- 二、LZW编码实例
- 三、代码展示及运行结果
- 四、程序自评价
一、LZW编码原理介绍
LZW(Lempel-Ziv-Welch)编码又称“串表压缩算法”,是 Welch 将 Lempel 和 Ziv 所提出来的无损压缩技术改进后的压缩方法。该算法通过建立一个字符串表,用较短的码字来表示较长的字符串来实现压缩。
举个例子:考虑序列‘abcabcabc’。
- 假如将每一个字母都用1个字符表示,那么需要传输的数据量为9个字符;
- 假如使用LZW编码,创建出字典使得‘abc’可以用一个字符表示(因为出现的概率大),则传输的数据量仅为3个字符。
编码基本思想:
- 将序列中所有出现一次的单个字符进行编码;
- 令 P 为前缀字符(此时为空),C 为当前读取字符(此时为第一个字符);
- 判断 PC 是否存在于当前的字典中。若存在,则令 P = PC;若不存在,则将当前的 PC 添加进字典中,再令 P = C。
- 重复第三步直到最后一个字符。
二、LZW编码实例
考虑序列 ‘abcbcabcabcd’。
初始编码字典为:
编码步骤为:
最终得到的扩充字典为:
三、代码展示及运行结果
根据上述编码基本思想,可以编写出如下代码:
%% 实验五-LZW编码
clear all
clc
%% 主函数
Str_input = input('请输入一串字符:n','s');
N = length(Str_input); % 获得输入字符串长度
% 定义初始字典
dic_ini = string({'a','1';'b','2';'c','3';'d','4'});
% 循环走完整个字符串,扩充字典
P = ''; % 初始化P
C = ''; % 初始化C
dic = dic_ini; % 初始化待扩充字典
Out_bits = ''; % 初始化输出码流
for i=1:N % 循环每一个字符
Len_dic = size(dic,1); % 当前字典长度
C = Str_input(i);
PC = strcat(P,C);
for m=1:Len_dic % 循环判断整个字典是否有当前的PC
if strcmp(PC, dic(m,1))==1
P = PC;
break;
else if m==Len_dic % PC不在当前的字典里
% 更新字典
dic(Len_dic+1,1) = PC;
dic(Len_dic+1,2) = num2str(Len_dic+1);
% 找到P在字典的位置,并输出相应码流
for n=1:Len_dic % 循环判断整个字典中当前P的位置
if strcmp(P, dic(n,1))==1
Out_bits = strcat(Out_bits,num2str(n));
end
end
% 更新P
P = Str_input(i);
end
end
end
end
% 将最后一步的输出码流加上
% 找到P在字典的位置,并输出相应码流
for n=1:Len_dic % 循环判断整个字典中当前P的位置
if strcmp(P, dic(n,1))==1
Out_bits = strcat(Out_bits,num2str(n));
end
end
% 输出初始字典
fprintf('初始字典:n');disp(dic_ini);
% 输出LZW编码后的码字流
fprintf('LZW编码后的码字流:t');disp(Out_bits);
% 输出扩充的字典
fprintf('扩充字典:n');disp(dic);
假设用户输入待编码序列为第二部分中的 ‘abcbcabcabcd’,输出结果如下:
根据上面进行验证,可以检验代码的正确性。
四、程序自评价
代码还有一些待改进的地方:
- 初始字典的定义:由于实验课上本人偷懒,所以直接定义了‘abcd’四个字母的初始字典(并保证输入序列都是由这四个字母组成的)。实际上要根据输入的序列,依次将所有的单个字母自动进行定义。
- 程序精简:也许可以写一个定义初始字典的子函数,和寻找字符在字典中位置的子函数。
代码原创,但因为原理编写参考到了实验课的指导书,假如有什么不对的地方,侵删。
最后
以上就是完美百褶裙为你收集整理的实验五-LZW编码的MATLAB实现一、LZW编码原理介绍二、LZW编码实例三、代码展示及运行结果四、程序自评价的全部内容,希望文章能够帮你解决实验五-LZW编码的MATLAB实现一、LZW编码原理介绍二、LZW编码实例三、代码展示及运行结果四、程序自评价所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复