📄 encode.asv
字号:
function[final,mn] = encode(n,f,nf,low,high)
%--------------------------------------------------------------------------
%此函数是编码过程
%基于算术编码的文本压缩,被main.m文件调用
%数组final记录了编码后的压缩流
%--------------------------------------------------------------------------
lo=0; %初始化区间的下限lo是0
hig=1;%初始化区间的上限hig是1
k=1;%初始化k为1,它是数组final的当前长度
mn=1e-5;%定义mn是1e-5,把它和当前的区间值比较,判断是否存储压缩数据
fin(1)=0;
for j=1:n %从第一个字符开始,依次计算上限和下限值
r=1;%初始化r为1
sign=0;%初始化标志位sign为0,表示未找到匹配的字符
while sign==0
if f(j)==nf(r),sign=1;%如果找到,置sign为1
else r=r+1;%否则,往后接着查找
end
end%循环结束时,r是f(j)在nf中的位置
nlow=lo+(hig-lo)*low(r);%根据公式,计算新的下限得到nlow
nhigh=lo+(hig-lo)*high(r);%根据公式,计算新的上限得到nhigh
if nhigh-nlow<mn %如果上限和下限的差距小于mn
final(k)=nlow;%就提取此时的下限值nlow作为压缩数据final(k)
% fprintf('j:%4.0f\n',j);fprintf('qujia:%12.10f\n',nhigh-nlow);
k=k+1;%把k加1,即增加final的长度
% fin(k)=j-sum(fin(1:k-1));%定义fin(k)表示提取压缩数据时在f中的位置
nlow=0;nhigh=1;%恢复下限和上限为初始值0和1
end
lo=nlow;%更新原来的下限值lo
hig=nhigh;%更新原来的上限值hig
end%循环结束时,k是fianl的长度加1
if nlow>0
final(k)=lo;%把最后得到的lo作为最后一个用于解码的数据
k=k+1;
fin(k)=n-sum(fin(1:k-1));
end
%final的最后一个数据是得到最后一个压缩数据前剩余的字符个数
final=final+fin(2:k);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -