信息论的第三个作业……终于是完完全全自己写的代码了!留下了不学无术的泪水QAQ
%算术编码程序
%输入:信源u、信源分布p、需要进行编码的序列s
%输入备注:输入格式:a=[0 1] p = [1/4 3/4] s = [1 0 1 1 1]
%输出:该序列的算术编码S
%输出备注:以序列所在区间的左端点值作为所求序列的码字
%输入备注:如果信源符号是字符型,输入方式为:a = 'ab'; s = 'bbbababb';
%其实符号是数字可以写成数组也可以写成字符类型,matlab都支持运算,如:a = '01' s = '1101'
%序列比较长的时候写成字符类型比较方便
function [S] = suanshu(a,p,s)
%设置初始值,序列为空,左端点为0,右端点为1,长度为1
Slow(1)=0;
Shigh(1)=1;
range=Shigh(1)-Slow(1);
%计算信源符号的数目和所需要编码的序列长度
n = length(a);
m = length(s);
%计算信源a中每个元素对应的左右端点low high
low(1) = 0;
for i = 1:n
if i == 1
high(i) = p(i);
else
low(i) = p(i-1) + low(i-1);
high(i) = low(i) + p(i);
end
end
%开始遍历所要编码序列中的每个元素
for i = 1:m
%寻找与当前元素相等的信源符号,把索引放入num中
num = find(a==s(i));
%开始计算添加新符号后的序列左右端点newSlow和newShigh
Slow(i+1) = Slow(i) + range*low(num);
Shigh(i+1) = Slow(i) + range*high(num);
range = Shigh(i+1) - Slow(i+1);
end
%最后以序列所在区间的左端点值作为所求序列的码字
%即输出最后计算得到的Slow(m+1)
S = Slow(m+1);
运行结果示例:
>> a = '01'
a =
01
>> p = [1/8 7/8]
p =
0.1250 0.8750
>> s = '11111110111110'
s =
11111110111110
>> suanshu(a,p,s)
ans =
0.6312