⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 decode.asv

📁 自适应编码 本发明的目标是生成一种方法:对数组压缩和解压缩编码
💻 ASV
字号:
function result=decode(final,m,nf,low,high,mn,f)
%--------------------------------------------------------------------------
%此函数是解码过程
%基于算术编码的文本压缩,被main.m文件调用
%输出数组result是解码后的字符按字节顺序存储的数组
%--------------------------------------------------------------------------
r=1;%初始化r为1,它是数组result的当前长度
s=1;%初始化s为1,它是当前用于解码的数据在final中的位置
remain=fix(final(1));%定义remain是final的最后一个数据
code=final(1)-remain;%初始化code为final(1),它是正在用于解码的数据
qujian=final(1)-fix(final(1)*mn);%初始化qujian为1,把它和1e-5比较,判断是否提取final的下一个数据

while remain>0%当s不是final的最后一个可用于解码的数据或remain>0时执行循环

    remain=remain-1;
%     fprintf('\nr:%4.0f\n',r);fprintf('remain:%4.0f\n',remain);fprintf('qujian:%12.16f\n',qujian);fprintf('code  :%12.16f\n',code);
    
    sign=0;%初始化标志位sign为0,表示未找到匹配的字符
    k=1;%初始化k为1
    while sign==0%当sign为0时,执行循环
        if code>=low(k)-1e-10%找到这样一个区间,满足high(k)>code>=low(k)
            result(r)=nf(k);%把nf的地k个字符作为result的第个字符
            r=r+1;%把加1,即把result的长度加1
            sign=1;%把sign置1,表示找到这样的区间
        else 
            k=k+1;%否则,把k加1,继续往后找
        end
    end%结束循环时,k是数组nf中匹配的字符的位置

%     fprintf('k:%8.0f\n',k);fprintf('s:%8.0f\n',s);fprintf('low   :%12.16f\n',low(k));fprintf('high  :%12.16f\n',high(k));
    
    lo=low(k);
    hig=high(k);
    code=abs(code-lo)/(hig-lo);%根据公式,更新code
    qujian=(hig-lo)*qujian;%把qujian的值还原为在原始区间[0,1)的子区间值
    

%     fprintf('qujian:%12.16f\n',qujian);fprintf('nmn:%12.16f\n',nmn);
    
    if remain==0&s<m%如果qujian小于mn并且s不指向最后一个压缩数据
        s=s+1;%把s加1
        remain=fix(final(s));
        code=final(s)-remain;%把code定义为final的第s个数据
        qujian=1;%把qujian还原为初始值1
        lo=0;hig=1;%恢复下限和上限为初始值0和1
    end
end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -