encode.asv

来自「自适应编码 本发明的目标是生成一种方法:对数组压缩和解压缩编码」· ASV 代码 · 共 43 行

ASV
43
字号
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 + =
减小字号Ctrl + -
显示快捷键?