Il part du principe qu'une matrice, c'est un tableau dont on veut remplir les cases.
Pour cela, il utilise la fonction
> let init_matrix f = Array.init n (fun i -> Array.init n (fun j -> f i j));;
qui prend en paramètre une fonction f à deux arguments et qui construit la matrice
f(0,0), f(0,1), f(0,2), f(0,3),...
f(1,0), f(1,1), f(1,2),...
f(2,0), f(2,1),...
f(3,0),...
Une fois qu'on a cette fonction, il suffit de donner en paramètre la fonction qui calcule le coëfficient. Je trouve cette approche très élégante.
Pour l'addition, c'est la fonction
> fun i j -> p1.(i).(j) +. p2.(i).(j)
qui me semble vraiment lisible.
Pour la multiplication, c'est la fonction
> fun i j -> sigma 0 (n-1) (fun k -> p1.(i).(k) *. p2.(k).(j))
Cette fonction est un poil plus compliquée mais pas trop.
il a d'abord défini la fonction
sigma i j f ->
qui calcule f(i)+. ...+.f(j)
ainsi, sigma 0 (n-1) (fun k -> p1.(i).(k) *. p2.(k).(j))
calcule p1.(i).(0)*p2.(0).(j)+. ... +. p1.(i).(n-1)*p2.(n-1).(j), ce qui est bien la valeur voulue.
Pour définir la matrice identité, on utilise
fun i j -> if i=j then 1. else 0.
etc...
Bref, ce n'est pas parce que vous n'avez pas l'habitude de programmer de façon fonctionnelle que son code n'est pas élégant.
[^] # Re: Lisibilité et produit de matrices
Posté par fmaz fmaz . En réponse à la dépêche OCaml 3.10.0 est sorti. Évalué à 4.
Il part du principe qu'une matrice, c'est un tableau dont on veut remplir les cases.
Pour cela, il utilise la fonction
> let init_matrix f = Array.init n (fun i -> Array.init n (fun j -> f i j));;
qui prend en paramètre une fonction f à deux arguments et qui construit la matrice
f(0,0), f(0,1), f(0,2), f(0,3),...
f(1,0), f(1,1), f(1,2),...
f(2,0), f(2,1),...
f(3,0),...
Une fois qu'on a cette fonction, il suffit de donner en paramètre la fonction qui calcule le coëfficient. Je trouve cette approche très élégante.
Pour l'addition, c'est la fonction
> fun i j -> p1.(i).(j) +. p2.(i).(j)
qui me semble vraiment lisible.
Pour la multiplication, c'est la fonction
> fun i j -> sigma 0 (n-1) (fun k -> p1.(i).(k) *. p2.(k).(j))
Cette fonction est un poil plus compliquée mais pas trop.
il a d'abord défini la fonction
sigma i j f ->
qui calcule f(i)+. ...+.f(j)
ainsi, sigma 0 (n-1) (fun k -> p1.(i).(k) *. p2.(k).(j))
calcule p1.(i).(0)*p2.(0).(j)+. ... +. p1.(i).(n-1)*p2.(n-1).(j), ce qui est bien la valeur voulue.
Pour définir la matrice identité, on utilise
fun i j -> if i=j then 1. else 0.
etc...
Bref, ce n'est pas parce que vous n'avez pas l'habitude de programmer de façon fonctionnelle que son code n'est pas élégant.