Huffman編碼m檔案分析
Huffman編碼m檔案分析
偶苦思一小時餘,方得正果,願與大家分享之。
E-MAIL:mmm@bbi.edu.cn
function [h,l]=huffman(p)
if (length(find(p<0))~=0)
error('Not a prob,negative component');
end
if (abs(sum(p)-1)>10e-10)
error('Not a prob.vector,component do not add 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);
ll(i)=length(find(abs(h(i,:))~=32));
end
l=sum(p.*ll);
[h,l]=huffman(p),輸入為一維行矩陣p,p為各符號的概率分佈,概率和為1,各元素值為
正,輸出H矩陣為對應每個符號概率的碼字,L為輸出碼字的平均碼長。Huffman .m運用典
型的IF和FOR控制流迴圈語句,該程式包括兩個IF 控制流和5個FOR 迴圈結構。
第一個IF 語句判斷輸入P矩陣各元素是否全為大於零的有效概率值;第二個IF 語句判斷
輸入矩陣的概率和是否為合理值1。
N取輸入行向量P的長度,即需要編碼元素個數。
M為N-1行、N列矩陣,用來記錄每行最小兩概率疊加後概率排列次序。
第一個FOR 迴圈確定概率大小值的排列,得到M矩陣。
第二個FOR迴圈生成一個N-1行、N2(N×N)列矩陣C,每行可看作N個段,每段長為N,記
錄一個碼字(每個碼字的長度不會超過N)。
給C矩陣的N-1行的第一個段賦值0,第二個段賦值1,這兩個碼字對應編碼中最後相加為一
的兩個概率。
第三個迴圈是本程式的主要部分,迴圈N-2次,決定矩陣C從倒數第二行開始到第一行的每
段的碼字值。每一行值都從下一行值得到,找到在下一行碼字中相加本行最小兩個概率得
到的概率的對應碼字,本行兩個最小概率對應碼字分別為此碼字最後加“0”,加“1”。
巢狀的第四個FOR迴圈找到其餘的本行在下一行對應的碼字,該碼字保持不變。迴圈結束
後,C矩陣第一行的N段對應輸入N個概率所對應符號的碼字。該碼字按碼字長短排列。
第五個FOR迴圈根據M矩陣第一行記錄的概率排序位置分配給每個概率對應符號的碼字。
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 ]
注:huffman.m from <<contemporary communication systems using MATLAB>>
written by John G.Proakis ,Masoud Salehi
偶苦思一小時餘,方得正果,願與大家分享之。
E-MAIL:mmm@bbi.edu.cn
function [h,l]=huffman(p)
if (length(find(p<0))~=0)
error('Not a prob,negative component');
end
if (abs(sum(p)-1)>10e-10)
error('Not a prob.vector,component do not add 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);
ll(i)=length(find(abs(h(i,:))~=32));
end
l=sum(p.*ll);
[h,l]=huffman(p),輸入為一維行矩陣p,p為各符號的概率分佈,概率和為1,各元素值為
正,輸出H矩陣為對應每個符號概率的碼字,L為輸出碼字的平均碼長。Huffman .m運用典
型的IF和FOR控制流迴圈語句,該程式包括兩個IF 控制流和5個FOR 迴圈結構。
第一個IF 語句判斷輸入P矩陣各元素是否全為大於零的有效概率值;第二個IF 語句判斷
輸入矩陣的概率和是否為合理值1。
N取輸入行向量P的長度,即需要編碼元素個數。
M為N-1行、N列矩陣,用來記錄每行最小兩概率疊加後概率排列次序。
第一個FOR 迴圈確定概率大小值的排列,得到M矩陣。
第二個FOR迴圈生成一個N-1行、N2(N×N)列矩陣C,每行可看作N個段,每段長為N,記
錄一個碼字(每個碼字的長度不會超過N)。
給C矩陣的N-1行的第一個段賦值0,第二個段賦值1,這兩個碼字對應編碼中最後相加為一
的兩個概率。
第三個迴圈是本程式的主要部分,迴圈N-2次,決定矩陣C從倒數第二行開始到第一行的每
段的碼字值。每一行值都從下一行值得到,找到在下一行碼字中相加本行最小兩個概率得
到的概率的對應碼字,本行兩個最小概率對應碼字分別為此碼字最後加“0”,加“1”。
巢狀的第四個FOR迴圈找到其餘的本行在下一行對應的碼字,該碼字保持不變。迴圈結束
後,C矩陣第一行的N段對應輸入N個概率所對應符號的碼字。該碼字按碼字長短排列。
第五個FOR迴圈根據M矩陣第一行記錄的概率排序位置分配給每個概率對應符號的碼字。
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 ]
注:huffman.m from <<contemporary communication systems using MATLAB>>
written by John G.Proakis ,Masoud Salehi
相關文章
- 檢測檔案編碼,轉換檔案編碼
- 前端檔案編碼方式前端
- Xliff Editor for Mac(Xliff檔案編輯工具) 支援M1/M2Mac
- m基於FPGA的Alamouti編碼verilog實現,包含testbench測試檔案FPGA
- 貪心演算法——Huffman 壓縮編碼的實現演算法
- Linux 檔案編碼大挪移Linux
- 文字檔案的編碼格式
- java 猜測 檔案編碼Java
- PDF檔案有限制密碼,該如何編輯檔案?密碼
- 轉換Linux 檔案編碼方式Linux
- 字元編碼與檔案處理字元
- vue原始碼分析系列之入口檔案分析Vue原始碼
- GC機制+字元編碼+檔案操作GC字元
- DBeaver如何調整sql檔案編碼SQL
- java安全編碼指南之:檔案IO操作Java
- Springboot 載入配置檔案原始碼分析Spring Boot原始碼
- webpack輸出檔案分析以及編寫一個loaderWeb
- 專案中常用的 .env 檔案原理原始碼分析原始碼
- 深入wepy原始碼:wpy檔案編譯過程原始碼編譯
- 編碼的進階,檔案操作,深淺copy
- 檔案 編碼為Base64字串字串
- C#自動檢測檔案的編碼C#
- Python3編碼如何實現檔案操作?Python
- Idea編碼UTF-8中.properties 配置檔案中文亂碼Idea
- APK 檔案分析APK
- hex檔案分析
- Mac系統下檔案編碼轉換工具encaMac
- Python編解碼問題與文字檔案處理Python
- 如何進行Linux下檔案編碼格式轉換Linux
- 入口檔案開始,分析Vue原始碼實現Vue原始碼
- Android Apk 檔案反編譯和重新打包的過程分析AndroidAPK編譯
- 用優先佇列構造Huffman Tree及判斷是否為最優編碼的應用佇列
- Fnt檔案編輯工具
- git編輯配置檔案Git
- 配置檔案的編寫
- Docker | dockerfile 檔案編寫Docker
- 如何編輯PDF檔案
- 如何編寫html檔案HTML
- 日常積累——彙編檔案編寫