huffman编码实验matlab

合集下载

matlab中霍夫曼编码函数的调用方法

matlab中霍夫曼编码函数的调用方法

matlab中霍夫曼编码函数的调用方法
MATLAB中霍夫曼编码函数的调用方法
MATLAB中霍夫曼编码函数的调用非常简单,只需要输入想要编码的矩阵,MATLAB就可以计算出霍夫曼编码的结果。

一、调用步骤:
1、首先,在MATLAB的命令窗口中输入“huffman(x)”,其中x 是想要编码的矩阵,例如:
huffman([1 2 3 4 5])
2、此时MATLAB就会输出霍夫曼编码结果,具体的输出结果如下所示:
ans =
'000': 1
'001': 2
'010': 3
'011': 4
'1': 5
此外,MATLAB还会把结果存储到一个结构数组中,您可以用“ans.code”和“ans.value”来查看编码和编码后的值,例如:
ans.code
ans =
'000' '001' '010' '011' '1'
ans.value
ans =
1 2 3 4 5
以上就所有MATLAB中霍夫曼编码函数的调用方法,希望本文对您有所帮助。

matlab 霍夫曼编码

matlab 霍夫曼编码

matlab 霍夫曼编码一、背景介绍二、霍夫曼编码原理三、matlab实现霍夫曼编码1. 建立霍夫曼树2. 构建编码表3. 压缩文件4. 解压文件四、应用举例一、背景介绍在信息传输和存储中,数据的压缩是一个重要的问题。

其中,霍夫曼编码是一种常用的无损压缩算法,通过对不同字符出现频率进行编码,可以将数据压缩到较小的空间中。

在matlab中,可以通过代码实现对数据的霍夫曼编码。

二、霍夫曼编码原理1. 需要进行压缩的数据由若干个字符组成。

2. 统计每个字符出现的频率,并根据频率构建霍夫曼树。

3. 根据霍夫曼树构建每个字符对应的编码表。

4. 将原始数据中每个字符按照对应的编码表进行编码,并将所有编码拼接为一个字符串。

5. 将字符串转换为二进制数列,并将其写入文件中。

解压时,需要读取二进制数列,并按照相应的编码表进行解码还原原始数据。

三、matlab实现霍夫曼编码1. 建立霍夫曼树在matlab中,可以通过以下代码实现霍夫曼树的构建:```matlabfunction [T, f] = huffmantree(p)n = length(p);f = p;T = zeros(n-1, 3);for i=1:n-1[f, j] = sort(f);T(i, 1:2) = j(1:2);T(i, 3) = f(1) + f(2);f(2) = T(i, 3);end```其中,p为每个字符出现的频率,n为字符数。

函数返回的T为霍夫曼树的结构矩阵,f为每个节点的权值。

2. 构建编码表在得到霍夫曼树之后,可以通过以下代码构建每个字符对应的编码表:```matlabfunction codebook(T)n = size(T, 1) + 1;codebook = cell(n, 2);for i=1:ncodebook{i, 1} = i;endfor i=1:n-1j = T(i, 1:2);for k=1:length(j)codebook{j(k), 2}=[codebook{j(k), 2},num2str(mod(k-1,2))]; if ~isempty(codebook{j(k), 2})codebook{j(k), 3}=[codebook{j(k), 3},i];elsecodebook{j(k), 3}=i;endendend```其中,codebook为编码表,第一列为字符编号,第二列为对应的编码。

r元huffman编码的matlab实现

r元huffman编码的matlab实现

r元huffman编码的matlab实现在数据压缩中,Huffman编码是一种常用的编码方式,它可以通过对不同字符出现频率的统计来生成一个不同长度的编码表,从而实现数据的压缩和解压缩。

而r元Huffman编码则是在Huffman编码的基础上增加了一个参数r,用于指定编码表中每个编码的长度必须是r的倍数。

这种编码方式在某些应用中,如无线传感器网络中的数据传输,有着更好的适用性和效率。

本文将介绍如何使用MATLAB实现r元Huffman编码。

具体步骤如下:1. 首先,需要先对数据进行预处理,将数据划分为长度为r的组,对每个组进行编码。

可以使用MATLAB中的reshape函数来完成这一步骤。

2. 对每个编码组进行频率统计,得到每个符号出现的频率。

3. 根据频率生成Huffman树,并构建编码表。

4. 将每个编码组按照编码表进行编码,生成压缩后的数据。

5. 对压缩后的数据进行解压缩,得到原始数据。

下面是一个简单的r元Huffman编码的MATLAB实现示例:```matlabfunction [compressed_data, codebook] =rHuffman_encode(input_data, r)% 输入参数:% input_data: 待压缩的数据,一个一维向量% r: 编码长度,一个正整数% 输出参数:% compressed_data: 压缩后的数据,一个一维向量% codebook: 编码表,一个结构体数组,每个结构体包含一个符号和对应编码% 预处理数据,将数据划分为长度为r的组num_groups = floor(length(input_data)/r);input_data = input_data(1:num_groups*r);input_data = reshape(input_data, r, num_groups)';% 对每个组进行频率统计freq = hist(input_data(:), unique(input_data(:)));% 生成Huffman树,并构建编码表tree = huffTree(freq);codebook = huffCode(tree);% 对每个编码组进行编码compressed_data = [];for i=1:num_groupsgroup_code = codebook([codebook.symbol] ==input_data(i,1)).code;for j=2:rgroup_code = [group_code, codebook([codebook.symbol] == input_data(i,j)).code];endcompressed_data = [compressed_data, group_code];endendfunction decoded_data = rHuffman_decode(compressed_data, codebook, r)% 输入参数:% compressed_data: 压缩后的数据,一个一维向量% codebook: 编码表,一个结构体数组,每个结构体包含一个符号和对应编码% r: 编码长度,一个正整数% 输出参数:% decoded_data: 解压缩后的数据,一个一维向量% 根据编码表进行解码decoded_data = [];while ~isempty(compressed_data)code = compressed_data(1:r);for i=1:length(codebook)if strcmp(code, codebook(i).code)decoded_data = [decoded_data, codebook(i).symbol];compressed_data = compressed_data(r+1:end);break;endendendend```以上代码实现了r元Huffman编码的两个基本函数:编码函数`rHuffman_encode`和解码函数`rHuffman_decode`。

(完整word版)huffman编码的matlab实现

(完整word版)huffman编码的matlab实现

Huffman编码的matlab实现一、信源编码介绍为了减少信源输出符号序列中的剩余度、提高符号的平均信息量,对所施行的变换。

具体说,就是针对信源输出符号序列的统计特性来寻找某种方法,把信源输出符号序列变换为最短的码字序列,使后者的各码元所载荷的平均信息量最大,同时又能保证无失真地恢复原来的符号序列。

既然信源编码的基本目的是提高码字序列中码元的平均信息量,那么,一切旨在减少剩余度而对信源输出符号序列所施行的变换或处理,都可以在这种意义下归入信源编码的范畴,例如过滤、预测、域变换和数据压缩等。

当然,这些都是广义的信源编码。

一般来说,减少信源输出符号序列中的剩余度、提高符号平均信息量的基本途径有两个:①使序列中的各个符号尽可能地互相独立;②使序列中各个符号的出现概率尽可能地相等。

前者称为解除相关性,后者称为概率均匀化。

信源编码的一般问题可以表述如下:信源编码若某信源的输出为长度等于M的符号序列集合式中符号A为信源符号表,它包含着K个不同的符号,A={ɑk|k=1,…,K},这个信源至多可以输出K M个不同的符号序列。

记‖U‖=KM。

所谓对这个信源的输出信源编码进行编码,就是用一个新的符号表B的符号序列集合V来表示信源输出的符号序列集合U。

若V的各个序列的长度等于 N,即式中新的符号表B共含L个符号,B={b l|l=1,…,L}。

它总共可以编出L N个不同的码字。

类似地,记‖V‖=LN。

为了使信源的每个输出符号序列都能分配到一个独特的码字与之对应,至少应满足关系‖V‖=L N≥‖U‖=KM或者N/M≥log K/log L下面的几个编码定理,提供了解决这个矛盾的方法。

它们既能改善信息载荷效率,又能保证码字唯一可译。

离散无记忆信源的定长编码定理对于任意给定的ε>0,只要满足条件N/M≥(H(U)+ε)/log L那么,当M足够大时,上述编码几乎没有失真;反之,若这个条件不满足,就不可能实现无失真的编码。

matlab霍夫曼编码函数

matlab霍夫曼编码函数

matlab霍夫曼编码函数Matlab是一个广泛应用于科学计算和工程领域的高级计算机语言和环境。

它提供了各种函数和工具箱,可用于解决各种数学问题和实现不同的算法。

霍夫曼编码是一种数据压缩算法,它通过将频率最高的字符编码为较短的比特串,从而实现对数据的有效压缩。

在本文中,我们将介绍如何在Matlab中实现霍夫曼编码函数。

首先,我们需要了解霍夫曼编码的基本原理。

该算法基于字符出现的频率构建一个霍夫曼树,其中出现频率较高的字符位于树的较低层,而出现频率较低的字符位于树的较高层。

然后,通过从根节点到每个字符的路径上的比特串表示字符的编码。

这样,频率较高的字符将使用较短的比特串编码,而频率较低的字符将使用较长的比特串编码。

在Matlab中实现霍夫曼编码,我们首先需要计算每个字符在给定数据中的出现频率。

我们可以使用Matlab提供的`histcounts`函数来实现这一点。

`histcounts`函数将数据分成一定数量的称为“bins”的区间,并计算每个区间中的数据的频数。

matlabdata = 'abcdefgh'; 给定的数据frequencies = histcounts(data, unique(data)); 计算每个字符的频数上述代码首先定义了一个包含字符的字符串,然后使用`unique`函数获取字符串中的唯一字符。

然后,`histcounts`函数基于这些唯一字符计算每个字符的频数,并将结果存储在名为“frequencies”的数组中。

下一步是构建霍夫曼树。

我们可以使用以下步骤来实现此操作:1. 创建一个含有所有字符频数的结点集合,并按照频率从低到高对结点排序。

2. 从频率最低的两个结点中创建一个新的父节点,并将这个父节点的频率设置为这两个结点的频率之和。

将这个新的父节点添加到结点集合中,并删除这两个被合并的结点。

3. 重复步骤2,直到只剩下一个节点为止。

这个节点将成为霍夫曼树的根节点。

霍夫曼编码的MATLAB实现(完整版).pdf

霍夫曼编码的MATLAB实现(完整版).pdf

%哈夫曼编码的 MATLAB 实现(基于 0、1 编码):clc;clear;A=[0.3,0.2,0.1,0.2,0.2];A=fliplr(sort(A));%T=A;信源消息的概率序列按降序排列[m,n]=size(A);B=zeros(n,n-1);% 空的编码表(矩阵)for i=1:nB(i,1)=T(i);%end生成编码表的第一列r=B(i,1)+B(i-1,1);%最后两个元素相加T(n-1)=r;T(n)=0;T=fliplr(sort(T));t=n-1;for j=2:n-1%生成编码表的其他各列for i=1:tB(i,j)=T(i);endK=find(T==r);B(n,j)=K(end);%%该列的位置从第二列开始,每列的最后一个元素记录特征元素在r=(B(t-1,j)+B(t,j));%T(t-1)=r;最后两个元素相加T(t)=0;T=fliplr(sort(T));t=t-1;end B;%输出编码表END1=sym('[0,1]');%给最后一列的元素编码END=END1;t=3;d=1;for j=n-2:-1:1%从倒数第二列开始依次对各列元素编码for i=1:t-2if i>1 & B(i,j)==B(i-1,j)d=d+1;elsed=1;end B(B(n,j+1),j+1)=-1;temp=B(:,j+1);x=find(temp==B(i,j));END(i)=END1(x(d));endy=B(n,j+1);END(t-1)=[char(END1(y)),'0'];END(t)=[char(END1(y)),'1'];t=t+1;END1=END;endA% 排序后的原概率序列END% 编码结果for i=1:n[a,b]=size(char(END(i)));L(i)=b;endavlen=sum(L.*A)% 平均码长H1=log2(A);H=-A*(H1')% 熵P=H/avlen%编码效率2。

1-matlab实现Huffman编码

1-matlab实现Huffman编码

%%%matlab统计矩阵个元素的出现次数data=[1 2 3;1 5 3;1 2 9];x=data(:); %将矩阵data中的元素按先列后行的顺序读入到矩阵x中x:n*1矩阵x=sort(x); %对矩阵x中的元素按升序排列d=diff([x;max(x)+1]);count=diff(find([1;d]));y=[x(find(d)) count]; %y(1)是矩阵中个元素,升序排列;y(2)是次数。

%各个元素归一化当成概率%制图: hist(x , unique(x));%不制图: h = hist(x, unique(x));num=size(y,2);y(:,2)=y(:,2)/sum(count);A=y(:,2)'; %A=[0.3,0.2,0.1,0.2,0.2];%信源消息的概率序列%% 哈夫曼编码的MATLAB实现(基于0、1编码):% clc;% clear;A=fliplr(sort(A));%按降序排列T=A;[m,n]=size(A);B=zeros(n,n-1);%空的编码表(矩阵)for i=1:nB(i,1)=T(i);%生成编码表的第一列end% i=5;r=B(i,1)+B(i-1,1);%最后两个元素相加% n=5;T(n-1)=r;T(n)=0;T=fliplr(sort(T));%按降序排列t=n-1;for j=2:n-1%生成编码表的其他各列for i=1:tB(i,j)=T(i);endK=find(T==r);B(n,j)=K(end);%从第二列开始,每列的最后一个元素记录特征元素在%该列的位置r=(B(t-1,j)+B(t,j));%最后两个元素相加T(t-1)=r;T(t)=0;T=fliplr(sort(T));t=t-1;endB;%输出编码表END1=sym('[0,1]');%给最后一列的元素编码END=END1;t=3;d=1;for j=n-2:-1:1%从倒数第二列开始依次对各列元素编码for i=1:t-2if i>1 & B(i,j)==B(i-1,j)d=d+1;elsed=1;endB(B(n,j+1),j+1)=-1;temp=B(:,j+1);x=find(temp==B(i,j));END(i)=END1(x(d));endy=B(n,j+1);END(t-1)=[char(END1(y)),'0'];END(t)=[char(END1(y)),'1'];t=t+1;END1=END;endA%排序后的原概率序列END%编码结果END = [ 0, 1, 10, 110, 111] for i=1:n[a,b]=size(char(END(i)));L(i)=b;endavlen=sum(L.*A)%平均码长H1=log2(A);H=-A*(H1')%熵P=H/avlen%编码效率。

huffman编码用matlab的实现

huffman编码用matlab的实现
Huffman编码用MTLAB的实现及编码注释
一、实验目的
1、学习Matlab软件的使用和编程;
2、进一步深入理解Huffman编码算法的原理;
3、提高独立进行算法编程的能力.
二、实验环境
硬件:计算机
软件:Windows 2003和MATLAB编程环境。
三、实验内容
1、用Matlab实现Huffman编码算法程序;
end
end
for i=1:n
h(i,1:n)=c(1,n*(find(a(1,:)==i)-1)+1:find(a(1,:)==i)*n)
ll(i)=length(find(abs(h(i,:))~=32))
end
l=sum(p。*ll);
fprintf('\n huffman code:\n’);
(3)视此节点为新符号,其概率等于被合并(缩减)的两个概率之和,参与概率排队。
(4)重复(2)(3)两步骤,直至全部符号都被合并(缩减)到根.
(5)从根出发,对各分枝标记0和1.从根到叶的路径就给出了各个码字的编码和码长。
2、程序设计的原理
(1)程序的输入:以一维数组的形式输入要进行huffman编码的信源符号的概率,在运行该程序前,显示文字提示信息,提示所要输入的概率矢量;然后对输入的概率矢量进行合法性判断,原则为:如果概率矢量中存在小于0的项,则输入不合法,提示重新输入;如果概率矢量的求和大于1,则输入也不合法,提示重新输入。
2、通过这个实验,对huffman编码的具体实现原理了解的更加深刻,在实验的过程中也遇到了一些问题,通过查找资料和相关书籍得到了解决,通过此次试验,了解了Huffman编码的特点,能够运用Huffman编码的基本原理及编码算法的来设计与实现程序。收获颇多,为以后更进一步学习奠定了基础,总的来说,在完成该实验的过程中,学到了比较多的知识,包括使对一些matlab语句的掌握的更加熟练,完成一个算法必须要有一个整体的把握等等。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

多媒体通信技术实验实验题目:Huffman编码
姓名:崔毅坚
学号:2008100894
班级: 通信08-03班
实验报告Huffman编码算法的实现
一、实验目的
1、学习Matlab软件的使用和编程;
2、进一步深入理解Huffman编码算法的原理;
3、提高独立进行算法编程的能力。

二、实验内容
1、用Matlab实现Huffman编码算法程序;
2、要求程序输出显示所有的码字以及编码效率;
3、设计简单的输入界面(可以是简单的文字提示信息),程序运
行时提示用户输入代表信源符号概率的向量;要对用户输入的概率向量进行合法性检查。

三、实验原理
1、二进制Huffman编码的基本原理及算法
(1) 把信源符号集中的所有符号按概率从大到小排队。

(2) 取概率最小的两个符号作为两片叶子合并(缩减)到一个节点。

(3) 视此节点为新符号,其概率等于被合并(缩减)的两个概率之和,参与概率排队。

(4) 重复(2)(3)两步骤,直至全部符号都被合并(缩减)到根。

(5) 从根出发,对各分枝标记0和1。

从根到叶的路径就给出了各个码字的编码和码长。

2、程序设计的原理
(1)程序的输入:以一维数组的形式输入要进行huffman编码的信源符号的概率,在运行该程序前,显示文字提示信息,提示所要输入的概率矢量;然后对输入的概率矢量进行合法性判断,原则为:如果概率矢量中存在小于0的项,则输入不合法,提示重新输入;如果概率矢量的求和大于1,则输入也不合法,提示重新输入。

(2)huffman编码具体实现原理:
1>在输入的概率矩阵p正确的前提条件下,对p进行排序,并用矩阵L记录p排序之前各元素的顺序,然后将排序后的概率数组p的前两项,即概率最小的两个数加和,得到新的一组概率序列,重复以上过程,最后得到一个记录概率加和过程的矩阵p以及每次排序之前概率顺序的矩阵a。

2>新生成一个n-1行n列,并且每个元素含有n个字符的空白矩阵,然后进行huffman编码:
将c矩阵的第n-1行的第一和第二个元素分别令为0和1(表示在编码时,根节点之下的概率较小的元素后补0,概率较大的元素后补1,后面的编码都遵守这个原则)
然后对n-i-1的第一、二个元素进行编码,首先在矩阵a中第n-i 行找到值为1所在的位置,然后在c矩阵中第n-i行中找到对应位置的编码(该编码即为第n-i-1行第一、二个元素的根节点),则矩阵c的第n-i行的第一、二个元素的n-1的字符为以上求得的编码值,根据之前的规则,第一个元素最后补0,第二个元素最后补1,则完成该行的第一二个元素的编码,
最后将该行的其他元素按照“矩阵c中第n-i行第j+1列的值等于对应于a矩阵中第n-i+1行中值为j+1的前面一个元素的位置在c矩阵中的编码值”的原则进行赋值,重复以上过程即可完成huffman编码。

3>计算信源熵和平均码长,其比值即为编码密码效率。

四、Huffman编码的Matlab源程序
p=input('please input a number:') %提示输入界面
n=length(p);
for i=1:n
if p(i)<0
fprintf('\n The probabilities in huffman can not less than 0!\n');
p=input('please input a number:') %如果输入的概率数组中有小于0的值,则重新输入
概率数组
end
end
if abs(sum(p)-1)>0
fprintf('\n The sum of the probabilities in huffman can more than 1!\n');
p=input('please input a number:') %如果输入的概率数组总和大于1,则重新输入概
率数组
end
q=p;
a=zeros(n-1,n); %生成一个n-1行n列的数组
for i=1:n-1
[q,l]=sort(q) %对概率数组q进行从小至大的排序,并且用l数组返回一个
数组,该数组表示概率数组q排序前的顺序编号a(i,:)=[l(1:n-i+1),zeros(1,i-1)] %由数组l构建一个矩阵,该矩阵表明概率合并时的顺序,用
于后面的编码
q=[q(1)+q(2),q(3:n),1]; %将排序后的概率数组q的前两项,即概率最小的两个数加和,
得到新的一组概率序列
end
for i=1:n-1
c(i,1:n*n)=blanks(n*n); %生成一个n-1行n列,并且每个元素的的长度为n的空白数组,c矩
阵用于进行huffman编码,并且在编码中与a矩阵有一定的对应关系end
c(n-1,n)='0'; %由于a矩阵的第n-1行的前两个元素为进行huffman编码加和运算时所得的最c(n-1,2*n)='1'; 后两个概率,因此其值为0或1,在编码时设第n-1行的第一个空白字符为0,
第二个空白字符1。

for i=2:n-1
c(n-i,1:n-1)=c(n-i+1,n*(find(a(n-i+1,:)==1))-(n-2):n*(find(a(n-i+1,:)==1))) %矩阵c的第n-i的
第一个元素的n-1的字符赋值为对应于a矩阵中
第n-i+1行中值为1的位置在c矩阵中的编码值
c(n-i,n)='0' %根据之前的规则,在分支的第一个元素最后补0
c(n-i,n+1:2*n-1)=c(n-i,1:n-1) %矩阵c的第n-i的第二个元素的n-1的字符与第n-i行的第一个元素
的前n-1个符号相同,因为其根节点相同
c(n-i,2*n)='1' %根据之前的规则,在分支的第一个元素最后补1
for j=1:i-1
c(n-i,(j+1)*n+1:(j+2)*n)=c(n-i+1,n*(find(a(n-i+1,:)==j+1)-1)+1:n*find(a(n-i+1,:)==
j+1)) %矩阵c中第n-i行第j+1列的值等于对应于a矩阵中第n-i+1行中值为j+1的前面一
个元素的位置在c矩阵中的编码值
end
end %完成huffman码字的分配
for i=1:n
h(i,1:n)=c(1,n*(find(a(1,:)==i)-1)+1:find(a(1,:)==i)*n) %用h表示最后的huffman编码,矩阵h
的第i行的元素对应于矩阵c的第一行的第i个元素ll(i)=length(find(abs(h(i,:))~=32)) %计算每一个huffman编码的长度
end
l=sum(p.*ll); %计算平均码长
fprintf('\n huffman code:\n');
h
hh=sum(p.*(-log2(p))); %计算信源熵
fprintf('\n the huffman effciency:\n');
t=hh/l %计算编码效率
五、程序运行结果
(1)如果输入正确的概率矢量,结果如下:
please input a number:[0.32 0.18 0.05 0.10 0.15 0.2]
p =
0.3200 0.1800 0.0500 0.1000 0.1500 0.2000
huffman code:
h =
11
00
1010
1011
100
01
the huffman effciency:
t = 0.9774
(2)如果输入不正确的概率矢量,结果如下:
please input a number:[-0.2 0.5 0.3 0.4]
p =
-0.2000 0.5000 0.3000 0.4000
The probabilities in huffman can not less than 0!
please input a number:[0.6 0.1 0.3 0.4]
p =
0.6000 0.1000 0.3000 0.4000
The sum of the probabilities in huffman can more than 1!
please input a number:[0.05 0.09 0.10 0.21 0.25 0.30]
p =
0.0500 0.0900 0.1000 0.2100 0.2500 0.3000
huffman code:
h =
0110
0111
010
00
10
11
the huffman effciency:
t =0.9894
六、实验总结
1、在该实验的过程中,利用一个矩阵记录每次排序前概率的所在位置,是该实验的关键,在编码的过程中利用该矩阵就能比较容易进行huffman编码。

2、通过这个实验,对huffman编码的具体实现原理了解的更加深刻,在实验的过程中也遇到了一些问题,通过查找资料和相关书籍得到了解决,总的来说,在完成该实验的过程中,还是学到了比较多的知识,包括使对一些matlab语句的掌握的更加熟练,完成一个算法必须要有一个整体的把握等等。

相关文档
最新文档