1. 程式人生 > 其它 >基於matlab實現哈夫曼編碼演算法

基於matlab實現哈夫曼編碼演算法

技術標籤:matlabmatlab演算法

查詢使用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);

編碼結果,在命令視窗上顯示出的
在這裡插入圖片描述