La méthode la plus simple pour calculer un
produit matriciel est de trouver les coefficients
un à un avec la formule ci-contre.
implémentation python avec
numpy
Exemples
L'algorithme de Strassen permet de calculer un produit matriciel en effectuant moins de
multiplications, car la méthode "classique" n'est pas optimale.
Cet algorithme ne s'applique que sur les matrices dont la taille est une puissance de 2. Ce n'est pas
vraiment une limitation car n'importe quelle matrice peut devenir de cette forme en completant les
lignes et les colonnes par des 0.
L'algorithme de Strassen est récursif : à chaque étape la matrice est divisée en quatres sous-matrices,
l'amélioration consistant à effectuer des opérations plus simples entre celles-ci par rapport à la
méthode dite classique. Le cas d'arrêt de la récusivité est celui où les matrices sont de taille 1x1.
Comparatif entre les opérations des 2 méthodes, la méthode de Strassen n'utilise que 7
multiplications mais bien plus d'additions.
méthode de Strassen méthode classique récursive
La complexité du produit classique est grande en O(n3). L'algorithme de Strassen, en économisant une
multiplication coûteuse, permet de réduire cette complexité à O(n2,8) au prix d'un plus grand nombre
d'opérations d'additions. La différence ne doit apparaitre que sur de grandes matrices.
Le temps d'exécution a été obtenu avec le module python timeit et la commande suivante dans une
console :
pour la méthode classique
pour la méthode de Strassen
pour la fonction intégrée de numpy (dot)
Remarque : Les tests ont été fait sur un ordinateur équipé d'un Athlon XP à 1,3 GHz.
classique Strassen dot (numpy)
matrice 4x4 758 usec 2,89 msec 349 usec
matrice 8x8 3,27 msec 19 msec 362 usec
matrice 16x16 22 msec 131 msec 415 usec
matrice 32x32 176 msec 880 msec 622 usec
matrice 64x64 1,43 sec 6,13 sec 1,9 msec
matrice 512x512 2,38 sec
Contrairement à ce qui avait
été imaginé, l'algorithme de
Strassen ne prend pas le
dessus sur la méthode
classique.
Plusieurs explications sont
possibles :
La récursivité rend
l'algorithme de Strassen
moins performant par rapport
à celui de la méthode
classique.
L'implémentation dans
un langage interprété comme
python ralentit les 2
algorithmes et repousse le
moment où l'algorithme de
Strassen prend l'avantage.
On remarque que la fonction interne de numpy est clairement plus performante, elle est
probablement compilée. Une version en C de l'algorithme de Strassen a été implementée pour tester
avec des matrices plus grandes mais le résultat était le même.
La méthode du pivot de Gauss propose de résoudre un système d'équations en triangonalisant la
matrice contenant les inconnues des équations. La dernière équation devient une simple égalité et on
remonte chaque ligne de la matrice en trouvant le résultat d'une nouvelle inconnue.
Exemple avec le système
d'équation :
La matrice correspondante est la
suivante :
Une fois la matrice triangonalisée, la solution est rapide à trouver :
Remarque : L'algorithme du pivot de Gauss ci-dessus ne gère pas le cas où le pivot serait égal à 0 (ce
qui conduirai à une divison par zéro). La solution est de chercher un pivot non nul en échangeant les
lignes de la matrice. Cette solution a été implementée dans la méthode suivante et aurai pu l'être
aussi ici.
La méthode Gauss-Jordan est une variante du pivot de Gauss plus pratique en algorithmie. La matrice
des équations est diagonalisée au lieu d'être triangonalisée, la solution du système d'équation est
alors immédiate.
Sur l'exemple précedent :
1 / 8 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !