Matlab實現Huffman編碼

2021-07-29 17:26:08 字數 2109 閱讀 5599

function

[ u, c, e, f] = huff_codec

( a )

%huff_codec 哈夫曼編碼的matlab實現

% author==frank

% 本程式重點在建樹和建表過程,以及求解平均碼長和編碼效率

% 因為建表的順序不一致,可能會導致碼表不一致,但是都滿足熵編碼要求

%u 輸出排序後的頻率分布

%c 輸出碼表

%e 輸出平均碼長

%f 輸出編碼效率 平均碼長/熵

%a 輸入的原始頻率分布,為行向量eg a=[1,2,3,4,5]

a=sort(a,'descend');%按降序排列

t=a;u=a;

a=a/sum(a);

[~,n]=size(a);

%生成待編碼矩陣,每列最後乙個元素為特殊元素的位置

b=zeros(n,n);

fori=1:n

b(i,1)=t(i);%生成編碼表的第一列

end r=b(i,1)+b(i-1,1);%最後兩個元素相加

t(n-1)=r;t(n)=0;

t=sort(t,'descend');

t=n-1;

forj=2:n%生成編碼表的其他各列

fori=1:t

b(i,j)=t(i);

endif t>1

k=find(t==r);

b(n,j)=k(end);%從第二列開始,每列的最後乙個元素記錄特徵元素在該列的位置

r=(b(t-1,j)+b(t,j));%最後兩個元素相加

t(t-1)=r;

t(t)=0;

t=sort(t,'descend');

t=t-1;

else

b(n,j)=1;

endend%生成huffman碼字矩陣和排序後元素的碼表向量

m=3;s1=sym('[2,1]');s2=s1;%碼表,用1表示0,2表示1,因為0會因為被省略導致無法記錄

%這裡意思是從倒數第三列開始建表,因為最後一列和倒數第二列的情況我們可以直接推出。

fori=n-2:-1:1

p=b(n,i+1);%p是每列儲存的特殊元素的位置,特殊元素指的是由上一列最後兩個數新合成的數

if p==1

s2(1:m-2)=s1(2:m-1);

elseif p==m

s2(1:m-2)=s1(1:m-2);

elseif p==2

s2(1)=s1(1);

s2(2:m-2)=s1(3:m-1);

else

s2(1:p-1)=s1(1:p-1);

s2(p+1:m-2)=s1(p+1:m-2);

ends2(m-1)=[char(s1(p)),'2'];

s2(m)=[char(s1(p)),'1'];

m=m+1;

s1=s2;

endl=zeros(1,n);

fori=1:n

[~,r]=size(char(s2(i)));

l(i)=r;

end%將碼表轉換成0和1輸出

arr=zeros(1,n);

arr(1:n)=s2(1:n);

str=;

fori=1:n

s=num2str(arr(i));

s=strrep(s,'1','0');

s=strrep(s,'2','1');

ifi==1

str=s;

else

str=[str,' ',s];

endend str=regexp(str,' ','split');

%計算返回值

c=str;

e=sum(l.*a);%平均碼長

h1=log2(a);

h=-a*(h1');%熵

f=h/e;%編碼效率

end

>>p=[1,2,3,4,5,6,7]

>>[ u, c, e, f] = huff_codec( p )

matlab實現huffman編碼

huffman編碼的MATLAB遞迴實現

huffman.m huffman編碼的遞迴實現。輸入 input 第一列為值,第二列為各個值的概率。codein,輸入即可,沒用,作遞迴時用到。輸出 output 排序後的input。code 對應p每行的huffman編碼。key 沒用,設為 即可,作遞迴時用到。參看測試 huffmantest...

Huffman編碼的實現

這裡的huffman編碼就是離散數學中學的最優二叉樹,現在我們用c 來實現它。首先考慮實現它使用的資料結構,當然這裡肯定使用二叉樹。其次就是儲存方式,對於樹一般情況是用間接儲存也就是鍊錶。但是二叉鍊錶不方便尋找雙親節點,這裡使用向量更好,對儲存空間的利用率也較高。建立資料結構 huffman樹中每個...

Huffman樹的實現

huffmantree.h inte ce for the huffmantree class.if defined afx huffmantree h e2fe6c12 c0a9 4483 af1b 9623f1fd0ef8 included define afx huffmantree h e2...