简单的程序工具: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实现程序的思路的文章!毕竟好不容易写出来都被自己给机智到了嘿嘿嘿~

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