% huffman编码生成器 %
% 函数说明: %
% [W,L,V,q]=huffman_better(P) 为huffman_better编码函数 %
% P为信源的概率矢量,W为编码返回的码字,V为码字的方差 %
% L为编码返回的平均码字长度,q为编码效率 %
%******************************************************* %
function [W,L,V,q]=huffman_better(P)
if (length(find(P<=0)) ~=0)
error('Not a prob.vector,negative component'); % 判断是否符合概率分布条件
end
if (abs(sum(P)-1)>10e-10)
error('Not a prob.vector,component do not add up to 1') % 判断是否符合概率和为1
end
n=length(P); % 计算输入元素个数
p=P;
mark=zeros(n-1,n); % mark为n-1行、n列矩阵,用来记录每行最小两概率叠加后概率排列次序
% 1) 确定概率大小值的排列,得到mark矩阵。
t=1;
for i=1:n-1
[p,num]=sort(p); % 对输入元素排序并纪录
if (i~=1)
if (count~=0)
k=max(a(t,:));
for s=count:-1:1
num(k-s)= num(k-s+1); % 若有与新项相等的项,则将新项尽可能排列在其右侧
end
num(k)=1;
end
t=t+1;
end
mark(i,:)=[num(1:n-i+1),zeros(1,i-1)];
p=[p(1)+p(2),p(3:n),1]; % 前两项求和得新项
count=0; % 用于计数
for j=2:n-i
if (p(1)==p(j)) % 判断p中是否有与求和后的新项相等的项
count=count+1;
a(t,count)=j;
end
end
end
% 2) 生成一个n-1行、n1(n×n)列矩阵table,每行可看做n个段,
% 每段长为n,记录一个码字(每个码字的长度不会超过n)。
for i=1:n-1
table(i,:)=blanks(n*n);
end
% 3) 计算各个元素码字,循环n-2次,决定矩阵table
% 从倒数第二行开始到第一行的每段的码字值,到编码表格table
table(n-1,n)='1'; % 小值赋1
table(n-1,2*n)='0'; % 大值赋0
for i=2:n-1
table(n-i,1:n-1)=table(n-i+1,n*(find(mark(n-i+1,:)==1))...
-(n-2):n*(find(mark(n-i+1,:)==1))); % 按mark的记录依次赋值
table(n-i,n)='1';
table(n-i,n+1:2*n-1)=table(n-i,1:n-1);
table(n-i,2*n)='0';
for j=1:i-1
table(n-i,(j+1)*n+1:(j+2)*n)=table(n-i+1,...
n*(find(mark(n-i+1,:)==j+1)-1)+1:n*find(mark(n-i+1,:)==j+1));
% 按mark的记录依次赋值
end
end
% 4)得到编码后的码字
for i=1:n
W(i,1:n)=table(1,n*(find(mark(1,:)==i)-1)+1:find(mark(1,:)==i)*n);
l(i)=length(find(abs(W(i,:))~=32));
end
L=sum(P.*l); % 计算平均码字长度
H=entropy(P,2); % 计算信源熵
V=sum(P.*((l-L).^2)); % 计算码字的方差,以判断编码方法的优劣
q=H/L; % 计算编码效率
% 打印输出结果
for i=1:n
B{i}=i;
end
[m,n]=size(W);
TEMP=blanks(m);
W=[W,TEMP',TEMP',TEMP'];
[m,n]=size(W);
W=reshape(W',1,m*n);
s0='很好!输入正确,编码结果如下:';
s1='Huffman编码所得码字W:';
s2='Huffman编码平均码字长度L:';
s3='Huffman编码所得码字W的方差V:';
s4='Huffman编码的编码效率q:';
disp(s0);
disp(s1),disp(B),disp(W);
disp(s2),disp(L);
disp(s3),disp(V);
disp(s4),disp(q)
钱亚锋
- 粉丝: 107
- 资源: 1万+
最新资源
- 基于Vue的大数据可视化平台,同时集成了安全预警系统。全部资料+详细文档+优秀项目.zip
- 基于WI-FI探针的商业大数据分析(前端)全部资料+详细文档+优秀项目.zip
- 基于车联网大数据的汽车换电站地址选取全部资料+详细文档+优秀项目.zip
- 基于大数据的蔬菜价格预测全部资料+详细文档+优秀项目.zip
- 基于大模型,帮你更好地算法和数据结构的AI应用全部资料+详细文档+优秀项目.zip
- 基于人脸识别的商业大数据分析全部资料+详细文档+优秀项目.zip
- 基于大数据的招聘数据展示平台全部资料+详细文档+优秀项目.zip
- 基于大数据分析的物流共享平台全部资料+详细文档+优秀项目.zip
- 基于flask的通用Zigbee网关,实现Zigbee网络与互联网双向通信全部资料+详细文档+源码+优秀项目.zip
- 基于 Zigbee 的生态养猪场信息管理系统,包含上位机和 Web 部分。全部资料+详细文档+源码+优秀项目.zip
- 基于 ZigBee 技术的室内环境远程监控系统全部资料+详细文档+源码+优秀项目.zip
- 基于SIM800C STM32 Zigbee的数据采集网关全部资料+详细文档+源码+优秀项目.zip
- 基于zigbee(cc2530)的温度监测系统全部资料+详细文档+源码+优秀项目.zip
- 基于RSSI的ZigBee室内定位全部资料+详细文档+源码+优秀项目.zip
- 基于ZigBee的智能家居控制系统全部资料+详细文档+源码+优秀项目.zip
- 机械设计生产管道平台sw20可编辑全套设计资料100%好用.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0