簡單的程序工具:matlab實現香農編碼

本來想從網上找現有的代碼省點時間...但是最後看了很多代碼還是自己各種修改重寫。

香農編碼的規則非常簡單,用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實現程序的思路的文章!畢竟好不容易寫出來都被自己給機智到了嘿嘿嘿~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章