• [^] # Re: Lisibilité et produit de matrices

    Posté par . En réponse à la dépêche OCaml 3.10.0 est sorti. Évalué à 4.

    C'est vraiment question d'habitude.

    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.