基于matlab实现哈夫曼编码算法

查找使用matlab实现的Huffman算法时找了很久,所以就贴出来大家分享下

正文

新建一个脚本,里面存放存储树节点的类

classdef Huffman
   properties
      leftNode = [] %左孩子
      rightNode = []%右孩子
      probability %权重
      code = '' %用来存放字符串
      character %该节点内存的值
   end
end

新建脚本,通过从根节点开始,递归实现

function f = loop(tempNode,codec)
global di;
ab=0;
if ~isempty(tempNode)
codec = [codec tempNode.code];

if ~isempty(tempNode.character)
disp(tempNode.character); %在界面上显示
disp(codec);  %要在界面上显示
ab=tempNode.character;

di(ab).code=codec;
%disp(di(ab).code)
end
if ~isempty(tempNode.code)

end
loop(tempNode.leftNode,codec);
loop(tempNode.rightNode,codec);
end
f=di;
end

调用的主函数

clc;
clear all;
close all;
a = [0.1 0.1 0.2 0.2 0.4];
b = ['a' 'b' 'c' 'd' 'e'];
% Empty Array of Object Huffman
thearray = Huffman.empty(256,0);

% Assign Initial Values
for i=1:length(a)
    thearray(i).probability = a(i);
    thearray(i).character = b(i);
end

temparray = thearray;

% Create the Binary Tree
for k = 1:size(temparray,2)-1

    % First Sort the temp array

    for i=1:size(temparray,2)
        for j = 1:size(temparray,2)-1
            if (temparray(j).probability > temparray(j+1).probability)
                tempnode = temparray(j);
                temparray(j) = temparray(j+1);
                temparray(j+1) = tempnode;
            end
        end
    end

    % Create a new node 

    newnode = Huffman;

    % Add the probailities
    newnode.probability = temparray(1).probability + temparray(2).probability;

    % Add Codes
     temparray(1).code = '0';
     temparray(2).code = '1';

    % Attach Chlldren Nodes
    newnode.leftNode = temparray(1);
    newnode.rightNode = temparray(2);

    % Delete the first two nodes

     temparray = temparray(3:size(temparray,2));

    % Prepend the new node

     temparray = [newnode temparray];

end

rootNode = temparray(1);
codec = '';
astr=string(a);
% Looping though the tree
% See recursive function loop.m
global di;
di=dic.empty(256,0);
p1=0;
loop(rootNode,codec);
aft='';
for i=1:m
    for j=1:n
        a=img(i,j);
        st=di(4).code;
        aft=[aft st];
    end
end
disp(aft)
global ans;
ans='';
yima(rootNode,rootNode,0);
imshow(img);

编码结果,在命令窗口上显示出的
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43666766/article/details/112205685