str1 = ['d', 'a', 'c', 'a', 'b'];
%统计字符串中的字符种类,调用函数,放入数组b中
b = unique(str1);
%统计每种字符的个数,放入数组a中
for i = 1 : length(b)
a(i) = length(strfind(str1, b(i)));
end
%排序,若数组b中的第一个元素为字符‘a’, 则数组a中的第一个元素为字符‘a’出现的次数
for i = 1 : length(a)-1
for j = i+1 : length(a)
if b(i) > b(j)
t1 = a(i); a(i) = a(j); a(j) = t1;
t2 = b(i); b(i) = b(j); b(j) = t2;
end
end
end
%统计每种字符出现的频率,放入数组fre中
for i = 1 : length(a)
fre(i) = a(i) / sum(a);
end
%根据频率分配概率范围,范围高值放入H中,范围低值放入L中
Li(1) = 0; Hi(1) = fre(1);
for i = 2 : length(fre)
Li(i) = Hi(i-1);
Hi(i) = Li(i) + fre(i);
end
%编码
L = 0; H = 1; %初始化
for i = 1 : length(str1)
W = H - L;
d = strfind(b, str1(i)); %找到字符串中的字符,在数组d中的角标
H = L + W * Hi(d);
L = L + W * Li(d);
end
code = [];
while true
tmp1 = 0; tmp2 = 0;
L = 2 * L; H = 2 * H;
if L >= 1
tmp1 = 1; L = L - 1;
end
if H >= 1
tmp2 = 1; H = H - 1;
end
if tmp1 ~= tmp2
code = [code '1']; break;
else
code = [code tmp1+'0'];
end
end
code
%译码
N = 0;
%二进制转化为十进制小数
decode = [ ];
for i = 1 : length(code)
N = N + (code(i) - '0') * power(2, -1*i);
end
for i = 1 : length(str1)
for j = 1 : length(fre)
if N >= Li(j) && N < Hi(j) %查找N属于哪个间隔
decode = [decode b(j)];
W = Hi(j) - Li(j);
N = (N - Li(j)) / W; %更新N
break;
end
end
end
decode
MATLAB实现算术编码
于 2021-12-07 22:07:05 首次发布