我制作了一个霍夫曼代码生成器(没有matlab自动命令),但是我在阅读结果时遇到了问题。
基本上我构建了一个接收(vec)gray_levels
和(vec)histogram
的函数,
并从中生成每个灰度值的概率向量。
然后我建造了一个霍夫曼树(这似乎是正确的根是1的概率)。
我的任务是创建一个矩阵(rows = hist rows,col =最长代码字的数量+ 1),似乎我得到了双倍的值。
我得到的最长码字是20位长(它应该是9-10),我认为它不是一个可能的值。
有没有人知道代码有什么问题?
我在树上使用简单的递归函数来提取最长的代码字, 和另一个递归函数,为树中的每个节点生成代码。
非常感谢! 问的代码:
function [ codeMat ] = Huffman( gray_levels,hist )
[entropy,probs]=Entropy(gray_levels,hist);
leaves=leaf.empty(decideSize(probs),0);
j=1;
for i=1:size(probs,1)
if(probs(i)~=1)
leaves(j).prob=probs(i);
leaves(j).index=i;
j=j+1;
end
end
temp=leaves;
while size(temp,2)>1
temp=sortAscendByProb(temp);
node=leaf;
node.prob=temp(1).prob+temp(2).prob;
temp(1).code='0';
temp(2).code='1';
node.left=temp(1);
node.right=temp(2);
temp=temp(3:size(temp,2));
temp=[node temp];
end
root=temp(1);
codec='';
longestCodeLen=FindLongestWord(root);
codeMat=zeros(numel(hist),longestCodeLen+1);
for i=1:size(codeMat,1)
codeMat(i,:)=2;
end
codeMat=loop(root,codec,codeMat);
end