哈夫曼编码 c或matlab
也不难!自己想去呗!
clear all;
I=[3,1,3,2,4,3,2,1,2,3];
len=length(I);
t=2;
biaozhi=0;
b(1)=I(1);
for i=2:len
for j=1:i-1
if I(j)==I(i)
biaozhi=1;
break;
end
end
if biaozhi==0
b(t)=I(i);
t=t+1;
end
biaozhi=0;
end
fprintf('信源总长度:
');
disp(len); %信源总长度
fprintf('字符:
');
disp(b );
L=length(b);
for i=1:L
a=0;
for j=1:len
if b(i)==I(j)
a=a+1;
count(i)=a;
end
end
end
count=count/len;%各字符概率
fprintf('各字符概率:
');
disp(count);
p=count;
%%%%%%%%%%%%%%%%%%%%%%%%%%%
s=0;
l=0;
H=0;
N=length(p);
for i=1:N
H=H+(- p(i)*log2(p(i)));%计算信源信息熵
end
fprintf('信源信息熵:
');
disp(H);
tic;
for i=1:N-1 %按概率分布大小对信源排序
for j=i+1:N
if p(i)<p(j)
m=p(j);
p(j)=p(i);
p(i)=m;
end
end
end
Q=p;
m=zeros(N-1,N);
for i=1:N-1 %循环缩减对概率值排序,画出由每个信源符号概率到1.0 处的路径,
[Q,l]=sort(Q);
m(i,:)=[l(1:N-i+1),zeros(1,i-1)];
Q=[Q(1)+Q(2),Q(3:N),1];
end
for i=1:N-1
c(i,:)=blanks(N*N);
end
c(N-1,N)='0';
c(N-1,2*N)='1';
for i=2:N-1 %对字符数组c码字赋值过程,记下沿路径的“1”和“0”;
c(N-i,1:N-1)=c(N-i+1,N*(find(m(N-i+1,:)==1))-(N-2):N*(find(m(N-i+1,:)==1)));
c(N-i,N)='0';
c(N-i,N+1:2*N-1)=c(N-i,1:N-1);
c(N-i,2*N)='1';
for j=1:i-1
c(N-i,(j+1)*N+1:(j+2)*N)=c(N-i+1,N*(find(m(N-i+1,:)==j+1)-1)+1:N*find(m(N-i+1,:)==j+1));
end
end
for i=1:N
h(i,1:N)=c(1,N*(find(m(1,:)==i)-1)+1:find(m(1,:)==i)*N);%码字赋值
ll(i)=length(find(abs(h(i,:))~=32)); %各码字码长
end
l=sum(p.*ll); %计算平均码长
n=H/l; %计算编码效率
fprintf('编码的码字:
');
disp(h) %按照输入顺序排列的码字
fprintf('平均码长:
');
disp(l) %输出平均码长
fprintf('编码效率:
');
disp(n) %输出编码效率
fprintf('计算耗时time= %f
',toc);
if (length(find(p<0))~=0)
error('Not a prob,negative component');
end
if (abs(sum(p)-1)>10e-10)
error('Not a prob.vector,component do not add to 1')
end
n=length(p);
q=p;
m=zeros(n-1,n);
for i=1:n-1
[q,l]=sort(q);
m(i,:)=[l(1:n-i+1),zeros(1,i-1)];
q=[q(1)+q(2),q(3:n),1];
end
for i=1:n-1
c(i,:)=blanks(n*n);
end
c(n-1,n)='0';
c(n-1,2*n)='1';
for i=2:n-1
c(n-i,1:n-1)=c(n-i+1,n*(find(m(n-i+1,:)==1))...
-(n-2):n*(find(m(n-i+1,:)==1)));
c(n-i,n)='0';
c(n-i,n+1:2*n-1)=c(n-i,1:n-1);
c(n-i,2*n)='1';
for j=1:i-1
c(n-i,(j+1)*n+1:(j+2)*n)=c(n-i+1,...
n*(find(m(n-i+1,:)==j+1)-1)+1:n*find(m(n-i+1,:)==j+1));
end
end
for i=1:n
h(i,1:n)=c(1,n*(find(m(1,:)==i)-1)+1:find(m(1,:)==i)*n);
ll(i)=length(find(abs(h(i,:))~=32));
end
l=sum(p.*ll);
h
l
厉潘雪凝: 程序如下:%哈夫曼编码的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:n B(i,1)=T(i);%生成编码表...
唐河县14784788916: 哈夫曼编码的matlab程序,求注释!!谢谢了 - ?
厉潘雪凝: 里面有一段看了几个小时都看不懂%哈夫曼编码的MATLAB实现(基于0、1编码):clc; clear; A=[0.4,0.2,0.15,0.1,0.1,0.05];%原概率序列%A=A/sum(A);%A=fliplr(sort(A));%按降序排列 T=A; [m,n]=size(A); B=zeros(n,n-1);%空的编码表(矩阵...
唐河县14784788916: 对灰度图像进行霍夫曼编码,用Matlab怎么实现啊? - ?
厉潘雪凝: 给你一段程序,自己研究下吧!clc clear close all; %定义HufData/Len为全局变量的结构体 global HufData; global Len disp('计算机正在准备输出哈夫曼编码结果,请耐心等待……'); %原始码字的灰度 a=imread('kids.tif');%分区画出原始...
唐河县14784788916: 数据结构题目,关于哈弗曼编码,用C语言来做(非常急的,谢谢了) - ?
厉潘雪凝: void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, int *w, int n) { // w存放n个字符的权值(均>0),构造哈夫曼树HT, // 并求出n个字符的哈夫曼编码HC int i, j, m, s1,s2; char *cd; int p; int cdlen; if (n m = 2 * n - 1; HT = (HuffmanTree)...
唐河县14784788916: 哈夫曼编码的C语言源代码 - ?
厉潘雪凝: 原发布者:丁丁的23号/*先根据位权构造一颗哈夫曼树,测试数据0.050.10.150.20.250.25,再从叶子结点到根结点编码.程序结果保存在out.dat中.*/#include#include#include#defineN6typedefstruct{doubleweight;intparent,lchild,rchild;}...
唐河县14784788916: 哈夫曼树及哈夫曼编码,c语言算法实现 - ?
厉潘雪凝: 我电脑里保存了类似的这样的题目,可以直接运行的: #include #include #include #include #include #include #define maxsize 50 //定义huffnode及huffcode,分别用来存储节点信息及各节点编码 typedef struct { char data; //节点值 int weight; //...
唐河县14784788916: 在信源概率分布比较均匀的情况下,哈夫曼的编码效率比算术编码的编...?
厉潘雪凝: 代码:function CODE = huffman(p)%HUFFMAN Builds a variable-length Huffman code for a symbol source.% CODE = HUFFMAN(P) returns a Huffman code as binary strings in% cell array CODE for input symbol probability vector P. Each word% ...
唐河县14784788916: 哈夫曼编码的算法代码?
厉潘雪凝: // 哈夫曼编码(算法) #include <stdio.h> #include <stdlib.h> #include <string.h> typedef char *HuffmanCode; //动态分配数组,存储哈夫曼编码 typedef struct { unsigned int weight; //用来存放各个结点的权值 unsigned int parent,LChild,RChild; ...
唐河县14784788916: 哈夫曼树和哈夫曼编码 - ?
厉潘雪凝: 给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近. 哈夫曼树(霍夫曼树)又称为最...