partie 1 :Compression :
Codage Huffman 1
function [code_huff,dico]=traitement_huffman(coderle)
% Générer le code Huffman. (version modifiée)
mat_occ=ocur (coderle); cliquez sur la fonction "ocur()" pour afficher son contenu
mat_occ=tri_cell_final (mat_occ); %matrice triée contient les éléments et leurs occurrences
cliquez sur la fonction "tri_cell_final()" pour afficher son contenu
[s1 taille]=size(mat_occ);
% 1 seul élément
if taille==1
dico{1,1}=mat_occ{1,1};
dico{2,1}='0';
for i=1:mat_occ{2,1}
code_huff{i}=dico{2,1};
end % end if
return
end % end if
% 2 éléments
if taille==2
dico{1,1}=mat_occ{1,1};
dico{2,1}='0';
dico{1,2}=mat_occ{1,2};
dico{2,2}='1';
coderle=normaliser_type (coderle); cliquez sur la fonction "normaliser_type()" pour afficher son contenu
for i=1:length(coderle)
if strcmp(dico{1,1},coderle{i})
code_huff{i}=dico{2,1};
else
code_huff{i}=dico{2,2};
end % end if
end % end for
return
end % end if
% 3 éléments
if taille==3
dico{1,1}=mat_occ{1,1};
dico{2,1}='10';
dico{1,2}=mat_occ{1,2};
dico{2,2}='1';
dico{1,3}=mat_occ{1,3};
dico{2,3}='0';
coderle=normaliser_type (coderle);
code_huff=calcul_codehuff (coderle,dico); return cliquez sur la fonction "calcul_codehuff()" pour afficher son contenu
end % end if
%AUTRES cas
%modification du tableau
taille2=round(taille/2);
for i=1:2:taille2-1
var=mat_occ{1,taille2+1-i};
mat_occ{1,taille2+1-i}=mat_occ{1,taille-i};
mat_occ{1,taille-i}=var;
var=mat_occ{2,taille2+1-i};
mat_occ{2,taille2+1-i}=mat_occ{2,taille-i};
mat_occ{2,taille-i}=var;
end % end for
%Modification du tableau d'occurrrences
clear tab1;clear tab2;
for i=1:taille2
tab1{1,i}=mat_occ{1,i};
tab1{2,i}=mat_occ{2,i};
end
k=1;
for i=taille2+1:taille
tab2{1,k}=mat_occ{1,i};
tab2{2,k}=mat_occ{2,i};
k=k+1;
end
tab1=tri_cell_final (tab1);
tab2=tri_cell_final (tab2);
clear mat_occ;
mat_occ=[tab1 tab2];
% création des structures
for i=1:taille
st=struct('element',mat_occ{1,i},'occurrence',mat_occ{2,i});
eval(['st' num2str(i) '=st;']);
end % end for
%liaison des structures : création de l'arbre
% 0 > droit , 1 > gauche
%traitement sous-arbre gauche
k=1;
noeud_d=struct('noeudd',st1,'noeudg',st2,'racine',st1.occurrence+st2.occurrence);
tab_bin{1,k}=st1.element;tab_bin{2,k}='1';
k=k+1;
tab_bin{1,k}=st2.element;tab_bin{2,k}='0';
k=k+1;
tab_bin{1,k}=noeud_d.racine;tab_bin{2,k}='1';
k=k+1;
for i=3:round(taille2)
eval(['st_=st' num2str(i) ';' ]);
noeud_d=struct('noeudd',noeud_d,'noeudg',st_,'racine',noeud_d.racine+st_.occurrence);
tab_bin{1,k}=st_.element;tab_bin{2,k}='0';k=k+1;
tab_bin{1,k}=noeud_d.racine;tab_bin{2,k}='1';k=k+1;
end % end for
%traitement sous-arbre gauche
eval(['st_d=st' num2str(round(taille2)+1) ';']);
eval(['st_g=st' num2str(round(taille2)+2) ';']);
noeud_g=struct('noeudd',st_d,'noeudg',st_g,'racine',st_d.occurrence+st_g.occurrence);
tab_bin{1,k}=st_d.element;tab_bin{2,k}='1';k=k+1;
tab_bin{1,k}=st_g.element;tab_bin{2,k}='0';k=k+1;
tab_bin{1,k}=noeud_g.racine;tab_bin{2,k}='1';k=k+1;
if round((taille2)+2)==taille
tab_bin{1,k-1}=noeud_g.racine;tab_bin{2,k-1}='0';
tab_bin{1,k-2}=st_g.element;tab_bin{2,k-2}='1';
tab_bin{1,k-3}=st_d.element;tab_bin{2,k-3}='0';
end % end if
if round(taille2+2)~=taille
for i=round(taille2)+3:taille-1
eval(['st_=st' num2str(i) ';' ]);
noeud_g=struct('noeudd',noeud_g,'noeudg',st_,'racine',noeud_g.racine+st_.occurrence);
tab_bin{1,k}=st_.element;tab_bin{2,k}='0';k=k+1;
tab_bin{1,k}=noeud_g.racine;tab_bin{2,k}='1';k=k+1;
end % end for
i=taille;
eval(['st_=st' num2str(i) ';' ]);
noeud_g=struct('noeudd',noeud_g,'noeudg',st_,'racine',noeud_g.racine+st_.occurrence);
tab_bin{1,k}=st_.element;tab_bin{2,k}='0';k=k+1;
tab_bin{1,k}=noeud_g.racine;tab_bin{2,k}='0';
end %end if
%construction finale de l'arbre
arbre=struct('noeudg',noeud_g,'noeudd',noeud_d,'racine',noeud_d.racine + noeud_g.racine);
ta_inverse=inverser (tab_bin); cliquez sur la fonction "inverser()" pour afficher son contenu
%générer le code 0> gauche, 1> droite
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if mod(2,taille)~=0
taille2=round(length(ta_inverse)/2)-1;
end
% sous-arbre gauche
i=1;
tab_code{1,i}=ta_inverse{1,i};
tab_code{2,i}=ta_inverse{2,i};
ch=ta_inverse{2,i};
i=2;
% -1 si length n'est pas un multiple de 2 sinon +0
while i<=taille2
tab_code{1,i}=ta_inverse{1,i};
tab_code{2,i}=[ch ta_inverse{2,i}];
tab_code{1,i+1}=ta_inverse{1,i+1};
tab_code{2,i+1}=[ch ta_inverse{2,i+1}];
ch=tab_code{2,i+1};
i=i+2;
end % end while
% sous-arbre droit
tab_code{1,i}=ta_inverse{1,i};
tab_code{2,i}=ta_inverse{2,i};
ch=ta_inverse{2,i};
i=i+1;
while i<=length(ta_inverse)-1
tab_code{1,i}=ta_inverse{1,i};
tab_code{2,i}=[ch ta_inverse{2,i}];
tab_code{1,i+1}=ta_inverse{1,i+1};
tab_code{2,i+1}=[ch ta_inverse{2,i+1}];
ch=tab_code{2,i+1};
i=i+2;
end % end while
%supprimer les racines
for i=1:length(tab_code)
if ischar(tab_code{1,i})
tab_code_final{1,i}=tab_code{1,i};
tab_code_final{2,i}=tab_code{2,i};
end % end if
end % end for
k=1;
for i=1:length(tab_code_final)
if ~isempty(tab_code_final{1,i})
dico{1,k}=tab_code_final{1,i};
dico{2,k}=tab_code_final{2,i};
if strcmp(dico{2,k},'00') % si le code =00 on le remplace par 0
dico{2,k}='0';
end % end if
if strcmp(dico{2,k},'01') % si le code =01 on le remplace par 1
dico{2,k}='1';
end %end if
k=k+1;
end % end if
end %end for
% construction du code huffman
coderle=normaliser_type (coderle);
code_huff=calcul_codehuff (coderle,dico);