function [code_out] = Huffman(s,p)
%s为各元素名称 p 为各元素概率
[Ms,Ns]=size(s);
if (Ms==1)
sig=s';
else
sig=s;
end
[Ms,Ns]=size(sig);
[Mp,Np]=size(p);
if (Ms~=Np)
return ;
end
code=cell(Ms,4); %建立编码 cell
code_out=cell(Ms,3); %建立输出 cell
coding=cell(Ms,2); %建立编码过程中用到的 cell
for i=1:Ms
code{i,1}=sig(i,:); %第一列为元素名称
code{i,2}=[]; %第二列为编码
code{i,3}=p(i); %第三列为元素概率
code{i,4}=[]; %第四列为元素概率排行
if p(i)==0
coding{i,1}=2;
else
coding{i,1}=p(i); %第一行为元素概率
end
coding{i,2}=i; %第二行表示此概率由哪些元素组成
end
[m,l]=Cell_min(coding(:,1)); %找出最小值
while (m<1) %若最小值小于 1(编码尚未完成)
[m1,l1]=Cell_min(coding(:,1)); %找出最小值
temp_p=coding{l1,1}; %记录下最小概率
coding{l1,1}=2; %将概率改为 2,则以后不会再次取到
[m2,l2]=Cell_min(coding(:,1)); %找出次小值
coding{l2,1}=coding{l2,1}+temp_p; %最小概率和次小概率相加得到新元素概率
[k,mp]=size(coding{l1,2}); %考虑最小概率包含了哪些元素
for i=1:mp
code{coding{l1,2}(i),2}=[1,code{coding{l1,2}(i),2}]; %在这些元素的编码前加 1
end
[k,mp]=size(coding{l2,2}); %考虑次小概率包含了哪些元素
for i=1:mp
code{coding{l2,2}(i),2}=[0,code{coding{l2,2}(i),2}]; %在这些元素的编码前加 0
end
coding{l2,2}=[coding{l2,2},coding{l1,2}]; %新元素包含了次小和最小元素包含的所有元素
[m,l]=Cell_min(coding(:,1)); %找出当前最小值,继续循环
end
for i=1:Ms
code_out(i,1:3)=code(i,1:3); %输出 cell 前3列等于编码 cell 前3 列
end