本來想從網上找現有的代碼省點時間...但是最後看了很多代碼還是自己各種修改重寫。
香農編碼的規則非常簡單,用matlab實現起來也非常簡單~就當作做作業時候的計算器啦。
代碼如下:
輔助的函數:
function y = dectobin(num,L)
%十進制小數轉換爲指定位數的二進制數
%num爲輸入的十進制小數
%L爲指定轉換後二進制的位數
i = 0;
bin = zeros(1,L);
for k = 1:L
i = i+1;
num = num * 2;%小數轉換爲二進制,乘2取整
if num >= 1%乘積大於一
bin(i) = 1;%二進制此位爲1
num = num - 1;
else
bin(i) = 0; %否則,二進制此位爲0
end
if(i >= L)%截取所需位數
break;
end
end
y = bin;
主函數:
function [ s_code,ave_L ] = Shannon_code( p )
%香農編碼
%p爲降序排列的概率分佈(便於需編碼字符與輸出編碼對應)
%s_code儲存香農編碼
%ave_L爲平均碼長
px = sort(p,'descend');%按降序排列
N = length(px);%需編碼的字符數目
ave_L = 0;
s_code={};
for i = 1:N
%求累加概率
p_sum = 0;
if (i==1)
p_sum=0;
else
for k = 1:i-1
p_sum = p_sum + px(k);
end
end
%求碼長
if (i == 1)
L = ceil(-log2(px(i))); %向上取整
y = zeros(1,L); %全0
else
L = ceil(-log2(px(i)));%L爲碼長
y = dectobin(p_sum,L);%十進制小數轉化爲二進制,截取L位
end
%求平均碼長
ave_L = ave_L + px(i) * L;
s_code{i}=y;
end
完成~
這個程序真的超級簡單啊,最近一定要花時間寫一篇有關任意進制哈夫曼編碼matlab實現程序的思路的文章!畢竟好不容易寫出來都被自己給機智到了嘿嘿嘿~