clear all;
str = ['d', 'a', 'c', 'b', 'b', 'c', 'b', 'b', 'd', 'e'];
%统计字符串中的字符种类,调用函数,放入数组b中
string = unique(str);
%统计每种字符的个数,放入数组a中
for i = 1 : length(string)
num(i) = length(strfind(str, string(i)));
end
%排序,若数组b中的第一个元素为字符‘a’, 则数组a中的第一个元素为字符‘a’出现的次数
for i = 1 : length(num)-1
for j = i+1 : length(num)
if num(i) < num(j)
t1 = num(i); num(i) = num(j); num(j) = t1;
t2 = string(i); string(i) = string(j); string(j) = t2;
end
end
end
string
num
H = 0; %熵
%统计每种字符出现的频率,放入数组P中
for i = 1 : length(num)
P(i) = num(i) / sum(num);
H = H + P(i) * log2( 1/P(i) );
end
P
%计算码字长度 Ni
N = [ ];
for i = 1 : length(P)
cnt = 1;
while true
if P(i)/2 <= power(2,-1*cnt) && power(2,-1*cnt) <= P(i)
break;
end
cnt = cnt + 1;
end
N = [N, cnt];
end
N
%计算累加概率 Ai
A = 0;
for i = 2 : length(string)
A(i) = A(i-1) + P(i-1);
end
A
L = 0; %平均码长
%转换为二进制
for i = 1 : length(A)
tmp = A(i);
code = [];
for j = 1 : N(i) %每个字符的编码长度 = Ni
if tmp >= power(2, -1*j)
tmp = tmp - power(2, -1*j);
code = [code '1'];
else
code = [code '0'];
end
end
fprintf("%c:%s\n", string(i), code);
L = L + P(i) * length(code);
end
fprintf("平均码长 L = %f\n", L);
fprintf("图像熵 H = %f\n", H);
fprintf("编码效率η = %f\n", H/L);
MATLAB实现香农-范诺编码
于 2021-12-07 22:00:17 首次发布