马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
我从网上找了霍夫曼编码的代码
然后自己修改了一下
可是运行之后就只有以下结果
信源信息熵:
0.7219
??? Error using ==> times
Matrix dimensions must agree.
附代码:
clear all;
i=0;
n=0;
H=0;
p1=0.8;
p2=0.2;
p=[p1,p2];
B=length(p);%p为概率矩阵
for i=1:B
H=H+(- p(i)*log2(p(i)));%计算信源信息熵
end
fprintf('信源信息熵:\n');
disp(H);
for n=2:8
W=[];
for i=0:n
W=[W p1^(n-i)*p2^i];
L=length(W);%W为概率矩阵
end
end
for i=1:L-1 %按概率分布大小对信源排序
for j=i+1:L
if W(i)<W(j)
m=W(j);
W(j)=W(i);
W(i)=m;
end
end
end
Q=W;
m=zeros(L-1,L);
for i=1:L-1 %循环缩减对概率值排序,画出由每个信源符号概率到1.0 处的路径,
[Q,l]=sort(Q);
m(i,:)=[l(1:L-i+1),zeros(1,i-1)];
Q=[Q(1)+Q(2),Q(3:L),1];
end
for i=1:L-1
c(i,:)=blanks(L*L);
end
c(L-1,L)='0';
c(L-1,2*L)='1';
for i=2:L-1 %对字符数组c码字赋值过程,记下沿路径的“1”和“0”;
c(L-i,1:L-1)=c(L-i+1,L*(find(m(L-i+1,:)==1))-(L-2):L*(find(m(L-i+1,:)==1)));
c(L-i,L)='0';
c(L-i,L+1:2*L-1)=c(L-i,1:L-1);
c(L-i,2*L)='1';
for j=1:i-1
c(L-i,(j+1)*L+1:(j+2)*L)=c(L-i+1,L*(find(m(L-i+1,:)==j+1)-1)+1:L*find(m(L-i+1,:)==j+1));
end
end
for i=1:L
h(i,1:L)=c(1,L*(find(m(1,:)==i)-1)+1:find(m(1,:)==i)*L);%码字赋值
ll(i)=length(find(abs(h(i,:))~=32)); %各码字码长
end
A=sum(p.*ll); %计算平均码长
E=H/A; %计算编码效率
n =2:0.1:8;
plot(n,E);%绘制曲线
望大神们赐教~~小女子将感激不尽~~在线等。。。。 |