4.1- TP - Programmation impérative
Ce TP a pour objectif de vous familiariser avec la programmation impérative en OCaml, c'est à dire avec des boucles et des références.
Nous allons faire du calcul matriciel, pas forcément extremement intéréssant, mais c'est de l'entrainement.
Pour représenter les matrices, nous allons utiliser un tableau de tableaux de flottants.
Loading editor...
type mat = float array array;;
Pour rappel, on dispose des fonctions suivantes pour travailler avec les tableaux :
Array.make n valpour créér un tableau 1D rempli devalArray.make_matrix n m validem pour 2 dimensions- On peut remplacer
makeparinit, auquel cas la valeur est remplacée par une fonction qui prend en argument l'indice et renvoie la valeur à cet indice.
Vous pouvez aussi convertir un entier en flottant avec float_of_int.
Q1
Ecrivez une fonction zero n m qui renvoie la matrice zéro de taille
Loading editor...
Q2
Ecrivez une fonction identite n qui renvoie la matrice identité de taille for imbriquées.
Loading editor...
Q3
Ecrivez une fonction random_mat: int -> int -> mat pour générer une matrice de taille Random.float max permet de générer un flottant aléatoire entre 0 et max.
Loading editor...
Q4
Ecrivez une fonction dim: mat -> int*int qui renvoie les dimensions d'une matrice.
Loading editor...
Q5
Ecrivez une fonction sum: mat -> mat -> mat qui réalise la somme de deux matrices de même taille. Votre fonction doit créer une nouvelle matrice pour le résultat.
Loading editor...
Q6
Ecrivez une fonction compat: mat -> mat -> bool qui détermine si deux matrices sont compatibles pour être multipliées.
Loading editor...
Q7
Ecrivez une fonction mul: mat -> mat -> mat qui multiplie deux matrices.
Loading editor...
Algorithme de Strassen
Wikipédia l'explique mieux que moi :
On découpe les matrices
On a alors :
Cette méthode nécessite 8 multiplications de matrices pour calculer les
La force de l'algorithme de Strassen réside dans un ensemble de sept nouvelles matrices
Les
Voir la page Wikipédia.
On se propose d'implémenter cet algorithme en OCaml. On se limitera aux matrices carrées.
Q8
Ecrivez des fonctions split: mat -> mat * mat * mat * mat et concat: mat * mat * mat * mat -> mat qui permettent de découper des matrices carrées et de les recoller. Tester votre fonction en vérifiant qu'une même matrice découpée recollée reste bien... La même matrice.
Loading editor...
Q9
Ecrivez une fonction moins: mat -> mat qui renvoie la négation d'une matrice.
Loading editor...
Q10
Ecrivez une fonction strassen: mat -> mat -> mat qui multiplie deux matrices en utilisant l'algorithme de Strassen. Quelle est sa complexité ?
Loading editor...
Pour votre culture, la meilleur complexité connue est actuellement
Voir la page Wikipédia.
Loading editor...
Entrez le code donné en cours pour accéder à la solution :