huff2man.m

%huff2man源程序
function x=huff2mat(y)
%huff2man解码一个Huffman编码的矩阵
%x=huff2man(y)解码一个Huffman编码的16比特的结构y
%field:
%y.min       x的最小值+32768
%y.size       x的大小
%y.hist       x的直方图
%y.code     Huffman编码

%输出x是双精度

if ~isstruct(y) | ~isfield(y,'min') | ~isfield(y,'size') | ...
        ~isfield(y,'hist') | ~field(y,'code')
    error('The input must be a structure as returned by MAT2HUFF');
end

sz=double(y.size);m=sz(1);n=sz(2);
xmin=double(y.min)-32768;%得到x的最小值
map=huffman(double(y.hist));%得到Huffman编码

%为Huffman解码程序创造一个二维调查表
%code包含源符号字符串与连接编码符合,
%当'link'包含映射(+)是给编码符号字符串加上0和1,映射(-)是给解码Huffman编码词放在map中。
%数组'left'是一列编码,目前给link入口加工的。

code=cellstr(char('','0','1'));%设置开始条件
link=[2;0;0];left=[2 3];
fiund=0;tofind=length(map);%处理变量

while length(left) & (found<tofind)
    look=find(strcmp(map,code{left(1)}));%map是否是字符串?
    if look%是的
        link(left(1))=-look;%指出 Huffman图
        left=left(2:end);%删除当前编码
        found=found+1;%found编码的增量
    else
        len=length(code);%不是的话,加上2编码与指标
        link(left(1))=len+1;%在编码中加指标
        
        link=[link;0;0];%加未加工的编码
        code{end+1}=strcat(code{left(1)},'0');
        code{end+1}=strcat(code{left(1)},'1');
        
        left=left(2:end);%删除加工编码
        left=[left len+1 len+2];%加2个未加工编码
    end
end

x=unravel(y.code',link,m*n);%使用C拆散解码
x=x+xmin-1;%调整x最小值的补偿
x=reshape(x,m,n);%是向量成为一个数组
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值