?? huffman.m
字號:
function [h,l]=huffman(p);
%HUFFMAN Huffman code generator
% [h,l]=huffman(p), Huffman code generator
% returns h the Huffman code matrix, and l the
% average codeword length for a source with
% probability vector p.
%[h,l]=huffman(p),輸入為一維行矩陣p,p為各符號的概率分布,概率和為1,各元素值為
%正,輸出H矩陣為對應(yīng)每個符號概率的碼字,L為輸出碼字的平均碼長。Huffman .m運(yùn)用典
%型的IF和FOR控制流循環(huán)語句,該程序包括兩個IF 控制流和5個FOR 循環(huán)結(jié)構(gòu)。
%第一個IF 語句判斷輸入P矩陣各元素是否全為大于零的有效概率值;第二個IF 語句判斷
%輸入矩陣的概率和是否為合理值1。
%N取輸入行向量P的長度,即需要編碼元素個數(shù)。
%M為N-1行、N列矩陣,用來記錄每行最小兩概率疊加后概率排列次序。
%第一個FOR 循環(huán)確定概率大小值的排列,得到M矩陣。
%第二個FOR循環(huán)生成一個N-1行、N2(N×N)列矩陣C,每行可看作N個段,每段長為N,記
%錄一個碼字(每個碼字的長度不會超過N)。
%給C矩陣的N-1行的第一個段賦值0,第二個段賦值1,這兩個碼字對應(yīng)編碼中最后相加為一
%的兩個概率。
%第三個循環(huán)是本程序的主要部分,循環(huán)N-2次,決定矩陣C從倒數(shù)第二行開始到第一行的每
%段的碼字值。每一行值都從下一行值得到,找到在下一行碼字中相加本行最小兩個概率得
%到的概率的對應(yīng)碼字,本行兩個最小概率對應(yīng)碼字分別為此碼字最后加“0”,加“1”。
%嵌套的第四個FOR循環(huán)找到其余的本行在下一行對應(yīng)的碼字,該碼字保持不變。循環(huán)結(jié)束
%后,C矩陣第一行的N段對應(yīng)輸入N個概率所對應(yīng)符號的碼字。該碼字按碼字長短排列。
%第五個FOR循環(huán)根據(jù)M矩陣第一行記錄的概率排序位置分配給每個概率對應(yīng)符號的碼字。
%FOR EXAMPLE:
%P=[1/6,1/4,5/12,1/6];
%N=4;
%M矩陣:
% m =[ 1 4 2 3;2 1 3 0;2 1 0 0]
%N矩陣:
% n =[1110 1110 110 0;
% 10 11 0 ;
% 0 1 ]
if length(find(p<0))~=0,
error('Not a prob. vector, negative component(s)')
end
if abs(sum(p)-1)>10e-10,
error('Not a prob. vector, components do not add up to 1')
end
n=length(p);
q=p;
m=zeros(n-1,n);
for i=1:n-1
[q,l]=sort(q);
m(i,:)=[l(1:n-i+1),zeros(1,i-1)];
q=[q(1)+q(2),q(3:n),1];
end
for i=1:n-1
c(i,:)=blanks(n*n);
end
c(n-1,n)='0';
c(n-1,2*n)='1';
for i=2:n-1
c(n-i,1:n-1)=c(n-i+1,n*(find(m(n-i+1,:)==1))...
-(n-2):n*(find(m(n-i+1,:)==1)));
c(n-i,n)='0';
c(n-i,n+1:2*n-1)=c(n-i,1:n-1);
c(n-i,2*n)='1';
for j=1:i-1
c(n-i,(j+1)*n+1:(j+2)*n)=c(n-i+1,...
n*(find(m(n-i+1,:)==j+1)-1)+1:n*find(m(n-i+1,:)==j+1));
end
end
for i=1:n
h(i,1:n)=c(1,n*(find(m(1,:)==i)-1)+1:find(m(1,:)==i)*n);
l1(i)=length(find(abs(h(i,:))~=32));
end
l=sum(p.*l1);
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -