#open "graphics";; let val x = max x (-x) ;; let identite n = let a = (make_matrix n n) 0 in for i=0 to n-1 do a.(i).(i)<-1 done ; a ;; let sigma a b f = let s=ref 0 in for i=a to b do s:= !s+(f i) done ; !s ;; let nb_li = vect_length ;; let nb_col m = vect_length (m.(0));; let s_vect a b = let l= vect_length a in if l<>(vect_length b) then failwith "somme vectorielle non définie car longueur différente" else let p=make_vect l 0 in for i=0 to l-1 do p.(i)<-(a.(i)+b.(i)) mod 2 done ; p ;; let s_mat a b = if (nb_col a)<>(nb_col b) then failwith "somme matricielle non définie car nombre de colones différent" else if (nb_li a)<>(nb_li b) then failwith "somme matricielle non définie car nombre de lignes différent" else let p=nb_col a in let n=nb_li a in let m=make_matrix n p 0 in for i=0 to n-1 do for j=0 to p-1 do m.(i).(j)<-(a.(i).(j)+b.(i).(j)) mod 2 done done ; m ;; let s_mat_li a b i = let m = make_matrix (nb_li a) (nb_col a) 0 in for j=0 to (nb_col a)-1 do m.(i).(j)<-(a.(i).(j)+b.(j)) mod 2 done ; m ;; let s_ele_mat m = let c=ref 0 in for i=0 to nb_li m -1 do for j=0 to nb_col m -1 do c:=!c+m.(i).(j) done done ; !c ;; let p_mat a b = if (nb_col a)<>(nb_li b) then failwith "produit matriciel non défini" else let n=nb_li a in let p=nb_col a in let q=nb_col b in let M = make_matrix n q 0 in for i=0 to n-1 do for j=0 to q-1 do M.(i).(j) <- ((sigma 0 (p-1) (fun k -> a.(i).(k)*b.(k).(j))) mod 2 ) done done ; M ;; let moyenne x y z = if (x+y+z)<2 then 0 else 1 ;; let val x = max x (-x) ;; let err m x y (*génère sur un matrice binaire des erreurs à un taux de x/y*) = let a = make_matrix (nb_li m) (nb_col m) 0 in for i=0 to (nb_li m)-1 do for j=0 to (nb_col m)-1 do let b=random__int y in if b0 do res.(!i)<-(!m mod 2) ; m:=!m/2 ; incr i done ; res ;; let bin_to_int m k = let a=ref 0 in for i=0 to k-1 do a:=!a+m.(i)*(puiss2 i) done ; !a ;; let n_lignes m = let n=nb_li m and p=nb_col m in match n*p mod 4 with |0-> n*p/4 |_-> n*p/4 + 1 ;; let transfo_quelc_mat4 m (*transforme une matrice quelconque en une matrice à 4 colones*) = let p=nb_col m and n=nb_li m and k=ref 0 and l=ref 0 in let r = make_matrix (n_lignes m) 4 0 in for i=0 to (n-1) do for j=0 to (p-1) do r.(!k).(!l) <- m.(i).(j) ; if !l=3 then (l:=0 ; incr k) else incr l done done; r ;; let transfo_mat4_quelc matrice n p = let i = ref 0 in let m = (nb_li matrice-1) and a = ref 0 and b = ref 0 and resultat = ref (make_matrix n p 1) and k=ref 0 and l = ref 0 in while !i < n*p do ((!resultat).(!k).(!l) <- matrice.(!a).(!b); if !l < (p-1) then incr l else (incr k ; l:=0);if !b < 3 then incr b else (b:=0 ; incr a);incr i) done ; !resultat ;; (*********************************************************************) ;; let gen_h = [|[|1;0;0;0;1;1;0|]; [|0;1;0;0;1;0;1|]; [|0;0;1;0;0;1;1|]; [|0;0;0;1;1;1;1|]|] ;; let cod_h m= p_mat m gen_h ;; let mat_ctrl_h = [|[|1;1;0|]; [|1;0;1|]; [|0;1;1|]; [|1;1;1|]; [|1;0;0|]; [|0;1;0|]; [|0;0;1|];|];; let ctrl_h m = p_mat m mat_ctrl_h ;; let decod m (*supprime les bits de parité*) = let p = make_matrix (nb_li m) 4 0 in for i=0 to (nb_li m)-1 do for j=0 to 3 do p.(i).(j) <- m.(i).(j) done done; p;; let correction m = let p=decod m in let c=ctrl_h m in for i=0 to (nb_li m)-1 do if c.(i)=[|0; 0; 0|] || c.(i) = [|1; 0; 0|] || c.(i) = [|0; 1; 0|] || c.(i) = [|0; 0; 1|] then () else if c.(i)= [|1; 1; 0|] then p.(i)<- (s_vect (p).(i) [|1; 0; 0; 0|]) else if c.(i)= [|1; 0; 1|] then p.(i)<- (s_vect (p).(i) [|0; 1; 0; 0|]) else if c.(i)= [|0; 1; 1|] then p.(i)<- (s_vect (p).(i) [|0; 0; 1; 0|]) else if c.(i)= [|1; 1; 1|] then p.(i)<- (s_vect (p).(i) [|0; 0; 0; 1|]) done; p ;; let carré = let c=make_matrix 121 121 0 in for i=0 to 120 do if i mod 4 = 0 then ( for j=i to 120-i do c.(i).(j)<- 1 ;c.(j).(i)<- 1 done; for j=120-i to i do c.(i).(j)<- 1 ;c.(j).(i)<- 1 done) done ; c ;; let convert_one_bit_rbg m = let p = make_matrix (vect_length m) (nb_col m) white in for i=0 to (nb_li m)-1 do for j=0 to (nb_col m)-1 do if m.(i).(j)=1 then p.(i).(j)<-black done done ; p ;; (*********************************************************************) ;; let dist_mat a b = s_ele_mat (s_mat a b) ;; let mat_err m x y = err m x y ;; let mat_corrige m x y =transfo_mat4_quelc (correction(err (cod_h (transfo_quelc_mat4 m)) x y)) (nb_li m) (nb_col m) ;; let image m a b = draw_image (make_image(convert_one_bit_rbg m )) a b ;; let image_err m x y a b = draw_image (make_image(convert_one_bit_rbg (err m x y))) a b ;; let image_corrige m x y a b = draw_image (make_image(convert_one_bit_rbg(transfo_mat4_quelc (correction(err (cod_h (transfo_quelc_mat4 m)) x y)) (nb_li m) (nb_col m)))) a b ;; open_graph "600*4000+10-10";; image carré 20 20 ;; image_err carré 1 20 20 160 ;; image_corrige carré 1 20 20 300 ;; dist_mat (mat_err carré 1 20) carré ;; dist_mat (mat_corrige carré 1 20) carré ;; (*********************************************************************) ;; let conv_color_bin m (*convertit une matrice couleur en une matrice de tableaux binaires*) = let p = make_matrix (nb_li m) (nb_col m) [||] in for i=0 to (nb_li m)-1 do for j=0 to (nb_col m)-1 do p.(i).(j)<-[||] done done ; for i=0 to (nb_li m)-1 do for j=0 to (nb_col m)-1 do p.(i).(j)<- int_to_bin m.(i).(j) 24 done done ; p ;; let conv_bin_color m = let p = make_matrix (nb_li m) (nb_col m) (white) in for i=0 to (nb_li m)-1 do for j=0 to (nb_col m)-1 do p.(i).(j)<- (bin_to_int m.(i).(j) 24) done done ; p ;; let compo n (*donne les composantes rgb d'une couleur*) = let res=make_vect 3 0 and m= ref n and i=ref 0 in while !m>0 do res.(2-(!i))<-(!m mod 256) ; m:=!m/256 ; incr i done ; res ;; let decompo_16 n (*décompose une composante en un couple (q,r) de 16*)= (n/16 , (n mod 16)) ;; let decompo_image m (*décompose les éléments matrice couleur en un tableau de 3 composantes sous la forme [|RRR;GGG;BBB]|*) = let n=(nb_li m) and p=(nb_col m) in let a= make_matrix n p [|0;0;0|] in for i=0 to n-1 do for j=0 to p-1 do a.(i).(j) <- compo m.(i).(j) done done ; a ;; let decompo_separ c (*décompose une couleur en un tableau de 3 composantes sous la forme (q,r)*)= let a=compo c in let m=[|(0,0);(0,0);(0,0)|] in for i=0 to 2 do m.(i)<-decompo_16 a.(i) done ; m ;; let decompo_image_separ m (*décompose les éléments matrice couleur en un tableau de 3 composantes sous la forme (q,r)*) = let n=(nb_li m) and p=(nb_col m) in let a= make_matrix n p [|0, 0; 0, 0; 0, 0|] in for i=0 to n-1 do for j=0 to p-1 do a.(i).(j) <- decompo_separ m.(i).(j) done done ; a ;; let image_to_bin_separ m = let a=decompo_image_separ m in let n=(nb_li m) and p=(nb_col m) in let b=make_matrix n p [|[|0;0;0;0|];[|0;0;0;0|];[|0;0;0;0|];[|0;0;0;0|];[|0;0;0;0|];[|0;0;0;0|]|] in for i=0 to n-1 do for j=0 to p-1 do b.(i).(j)<- [|[|0;0;0;0|];[|0;0;0;0|];[|0;0;0;0|];[|0;0;0;0|];[|0;0;0;0|];[|0;0;0;0|]|] done done; for i=0 to n-1 do for j=0 to p-1 do for k=0 to 2 do b.(i).(j).(2*k)<-int_to_bin (fst a.(i).(j).(k)) 4 ; b.(i).(j).(2*k+1)<-int_to_bin (snd a.(i).(j).(k)) 4 done done done; b ;; let simplifier_matrice m = let n=(nb_li m) and p=(nb_col m) in let a=make_matrix n (144*p) 0 in for i=0 to n-1 do for j=0 to p-1 do for k=0 to 5 do for l=0 to 23 do a.(i).(6*j+24*k+l)<- m.(i).(j).(k).(l) done done done done ; a ;; let simplifier_matrice_2 m = let n=(nb_li m) and p=(nb_col m) in let a=make_matrix n (24*p) 0 in for i=0 to n-1 do for j=0 to p-1 do for k=0 to 23 do a.(i).(24*j+k)<- m.(i).(j).(k) done done done ; a ;; let remplace_matrice m = let n=(nb_li m) and p=(nb_col m) in let a=make_matrix n (p/144) [|[|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0;0|]; [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0;0|]; [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0;0|]; [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0;0|]; [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0;0|]; [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0;0|]; [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0;0|]|] in for i=0 to n-1 do for j=0 to p/144-1 do a.(i).(j)<- [|[|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0;0|]; [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0;0|]; [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0;0|]; [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0;0|]; [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0;0|]; [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0;0|]; [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0;0|]|] done done ; for i=0 to n-1 do for j=0 to p/144-1 do for k=0 to 5 do for l=0 to 23 do a.(i).(j).(k).(l)<- m.(i).(6*j+24*k+l) done done done done ; a ;; let remplace_matrice_2 m = let n=(nb_li m) and p=(nb_col m) in let a=make_matrix n (p/24) [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0;0|] in for i=0 to n-1 do for j=0 to (p/24)-1 do a.(i).(j)<-[|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0;0|]done done; for i=0 to n-1 do for j=0 to p/24-1 do for k=0 to 23 do a.(i).(j).(k)<- m.(i).(24*j+k) done done done ; a ;; let image_to_bin_redon m = let a=decompo_image_separ m in let n=(nb_li m) and p=(nb_col m) in let b=make_matrix n p [|[||];[||];[||];[||];[||];[||];[||];[||];[||];[||];[||];[||];|] in for i=0 to n-1 do for j=0 to p-1 do b.(i).(j)<- [|[||];[||];[||];[||];[||];[||];[||];[||];[||];[||];[||];[||];|] done done; for i=0 to n-1 do for j=0 to p-1 do for k=0 to 2 do b.(i).(j).(4*k)<-int_to_bin (fst a.(i).(j).(k)) 4 ;b.(i).(j).(4*k+1)<-int_to_bin (fst a.(i).(j).(k)) 4; b.(i).(j).(4*k+2)<-int_to_bin (fst a.(i).(j).(k)) 4 ; b.(i).(j).(4*k+3)<-int_to_bin (snd a.(i).(j).(k)) 4 done done done; b ;; let simplifier_matrice_redon m = let n=(nb_li m) and p=(nb_col m) in let a=make_matrix n (48*p) 0 in for i=0 to n-1 do for j=0 to p-1 do for k=0 to 11 do for l=0 to 3 do a.(i).(48*j+4*k+l)<- m.(i).(j).(k).(l) done done done done ; a ;; let corrige m = let n=(nb_li m) and p=(nb_col m) in let a=make_matrix n p [|[|0; 0; 0; 0|]; [|0; 0; 0; 0|]; [|0; 0; 0; 0|]; [|0; 0; 0; 0|]; [|0; 0; 0; 0|]; [|0; 0; 0; 0|]|] in for i=0 to n-1 do for j=0 to p-1 do a.(i).(j)<- [|[|0; 0; 0; 0|]; [|0; 0; 0; 0|]; [|0; 0; 0; 0|]; [|0; 0; 0; 0|]; [|0; 0; 0; 0|]; [|0; 0; 0; 0|]|] done done ; for i=0 to n-1 do for j=0 to p-1 do for k=0 to 2 do for l=0 to 3 do a.(i).(j).(2*k).(l) <-moyenne m.(i).(j).(4*k).(l) m.(i).(j).(4*k+1).(l) m.(i).(j).(4*k+2).(l); a.(i).(j).(2*k+1).(l)<- m.(i).(j).(4*k+3).(l) done done done done; a ;; let bin_to_image_2 m = let n=nb_li m and p=nb_col m in let a=make_matrix n p white in for i=0 to n-1 do for j=0 to p-1 do a.(i).(j)<-bin_to_int m.(i).(j) 24 done done ; a ;; let bin_to_image m = let n=nb_li m and p=nb_col m in let a=make_matrix n p white in for i=0 to n-1 do for j=0 to p-1 do a.(i).(j)<-rgb (16*(bin_to_int m.(i).(j).(0) 4)+bin_to_int m.(i).(j).(1) 4) (16*(bin_to_int m.(i).(j).(2) 4)+bin_to_int m.(i).(j).(3) 4) (16*(bin_to_int m.(i).(j).(4) 4)+bin_to_int m.(i).(j).(5) 4) done done ; a ;; let remplace_matrice_redon m = let n=(nb_li m) and p=(nb_col m) in let a=make_matrix n (p/48) [|[|0; 0; 0; 0;|]; [|0; 0; 0; 0;|]; [|0; 0; 0; 0;|]; [|0; 0; 0; 0;|]; [|0; 0; 0; 0;|]; [|0; 0; 0; 0;|]; [|0; 0; 0; 0;|]; [|0; 0; 0; 0;|]; [|0; 0; 0; 0;|]; [|0; 0; 0; 0;|]; [|0; 0; 0; 0;|]; [|0; 0; 0; 0;|]|] in for i=0 to n-1 do for j=0 to (p/48)-1 do a.(i).(j)<- [|[|0; 0; 0; 0;|]; [|0; 0; 0; 0;|]; [|0; 0; 0; 0;|]; [|0; 0; 0; 0;|]; [|0; 0; 0; 0;|]; [|0; 0; 0; 0;|]; [|0; 0; 0; 0;|]; [|0; 0; 0; 0;|]; [|0; 0; 0; 0;|]; [|0; 0; 0; 0;|]; [|0; 0; 0; 0;|]; [|0; 0; 0; 0;|] |] done done ; for i=0 to n-1 do for j=0 to p/48-1 do for k=0 to 11 do for l=0 to 3 do a.(i).(j).(k).(l)<- m.(i).(48*j+4*k+l) done done done done ; a ;; let moyenne_2 a b c= let n=nb_li a and p=nb_col a in let m=make_matrix n p [|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0;0|] in for i=0 to n-1 do for j=0 to p-1 do m.(i).(j)<-[|0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0;0|] done done ; for i=0 to n-1 do for j=0 to p-1 do for k=0 to 23 do m.(i).(j).(k)<-moyenne a.(i).(j).(k) b.(i).(j).(k) c.(i).(j).(k) done done done ; m ;; (*********************************************************************) ;; let fr n p =let a=make_matrix n p blue in for i=0 to n-1 do for j=p/3 to 2*(p/3)-1 do a.(i).(j)<-white done ; for j=2*(p/3) to p-1 do a.(i).(j)<-red done done ; a ;; let image_color m a b = draw_image (make_image m ) a b ;; let image_color_err m x y a b = draw_image (make_image (conv_bin_color (err_bin(conv_color_bin m) x y))) a b ;; let mat_color_err m x y = conv_bin_color (err_bin(conv_color_bin m) x y) ;; let mat_color_corrige m x y = bin_to_image_2( remplace_matrice_2( transfo_mat4_quelc(correction(err(cod_h(transfo_quelc_mat4(simplifier_matrice_2(conv_color_bin m))))x y)) (nb_li m) ((nb_col m)*24))) ;; let mat_color_corrige_separ m x y =bin_to_image(corrige(remplace_matrice_redon( transfo_mat4_quelc (correction(err(cod_h(transfo_quelc_mat4(simplifier_matrice_redon(image_to_bin_redon m)))) x y)) (nb_li m) ((nb_col m)*48))));; let image_color_corrige m x y a b = draw_image( make_image( bin_to_image_2( remplace_matrice_2( transfo_mat4_quelc(correction(err(cod_h(transfo_quelc_mat4(simplifier_matrice_2(conv_color_bin m))))x y)) (nb_li m) ((nb_col m)*24))))) a b ;; let image_color_corrige_separ m x y a b = draw_image (make_image (bin_to_image(corrige(remplace_matrice_redon( transfo_mat4_quelc (correction(err(cod_h(transfo_quelc_mat4(simplifier_matrice_redon(image_to_bin_redon m)))) x y)) (nb_li m) ((nb_col m)*48)))))) a b ;; let image_color_primitif m x y a b = draw_image (make_image(conv_bin_color (moyenne_2 (err_bin (conv_color_bin m) x y) (err_bin (conv_color_bin m) x y) (err_bin (conv_color_bin m) x y)))) a b ;; open_graph "";; image_color (fr 60 100)200 20 ;; image_color_err (fr 60 100) 1 20 200 120 ;; image_color_corrige (fr 60 100) 1 20 200 220 ;; image_color_corrige_separ (fr 60 100) 1 20 200 320 ;; image_color_primitif (fr 60 100) 1 20 200 420 ;; image_color_err (fr 60 100) 1 5 400 120 ;; image_color_corrige (fr 60 100) 1 5 400 220 ;; image_color_corrige_separ (fr 60 100) 1 5 400 320 ;; image_color_primitif (fr 60 100) 1 5 400 420 ;; moyenne_2(err_bin (conv_color_bin (fr 60 100))1 20)(err_bin (conv_color_bin (fr 60 100))1 20)(err_bin (conv_color_bin (fr 60 100))1 20);; let dist_mat_color m1 m2 = let m3 = decompo_image m1 and m4 = decompo_image m2 in let hauteur = nb_li m1 and longueur = nb_col m1 in let n = ref 0 in for i = 0 to hauteur-1 do for j = 0 to longueur-1 do for k=0 to 2 do n:=!n+ val (m3.(i).(j).(k)-m4.(i).(j).(k)) done done done; !n ;; dist_mat_color (fr 60 100) (mat_color_err (fr 60 100) 1 20) ;; dist_mat_color (fr 60 100) (mat_color_corrige (fr 60 100) 1 20) ;; dist_mat_color (fr 60 100) (mat_color_corrige_separ (fr 60 100) 1 20) ;;