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

📄 huff2mat.m

📁 霍夫曼coding程序
💻 M
字号:
function x = huff2mat(y)
%HUFF2MAT decodes a Huffman encoded matrix.
%   X = HUFF2MST(Y) decodes a Huffman encoded structure Y with uint16
%   fields:
%       Y.min   Minimum value of X plus 32768
%       Y.size  Size of X
%       Y.hist  Histogram of X
%       Y.code  Huffman code
%
%   The output X is of class double.
%
%   See also MAT2HUFF.

if ~isssturct(y) | ~isfield(y , 'min') | ~isfield(y , 'size') | ...
        ~isfield(y , 'hist') | ~isfield(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;       % Get X minimum
map = huffman(double(y.hist));      % Get Huffman code (cell)

% Create a binary search table for the Huffman decoding process.
% 'code' contains source symbol strings corresponding to 'link'
% nodes, while 'link' contains the addresses (+) to node pairs for
% node symbol strings plus '0' and '1' or addresses (-) to decoded
% Huffman codewords in 'map'. Array 'left' is a list of nodes yet to
% be processed for 'link' entries.

code = cellstr(char('' , '0' , '1'));       % Set starting conditions as
link = [2 ; 0 ; 0]; left = [2 3];           % 3 nodes w/2 unprocessed
found = 0;  tofind = length(map);           % Tracking variables

while length(left) & (found < tofind)
    look = find(strcmp(map , code{left(1)}));   % Is string in map?
    if look                                 % Yes
        link(left(1)) = -look;              % Point to Huffman map
        left = left(2 : end);               % Delete current node
        found = found + 1;
        
    else                                    % No, add 2 nodes & pointers
        len = length(code);                 % Put pointers in node
        link(left(1)) = len + 1;
        
        link = [link ; 0 ; 0];              % Add unprocessed nodes
        code{end + 1} = strcat(code{left(1)} , '0');
        code{end + 1} = strcat(code{left(1)} , '1');
        
        left = left(2 : end);               % Remove processed node
        left = [left len + 1 len + 2];      % Add 2 unprocessed nodes
    end
end

x = unravel(y.code' , link , m * n);        % Decode using C 'unravel'
x = x + xmin - 1;                           % X minimum offset adjust
x = reshape(x , m , n);                     % Make vector an array

⌨️ 快捷键说明

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