Monsieur Excel
Pour tout savoir faire sur Excel !

26 mai 2010

Le produit matriciel dans Excel

Supposons que vous désiriez obtenir une matrice C = A * B, c’est-à-dire qui soit le produit de deux autres matrices A et B. Dans l’exemple ci-dessous, nous voyons un exemple de ce produit matriciel.

La formule saisie de façon matricielle – donc avec la combinaison [Ctrl]-[Maj]-[Entrée] – dans les cellules A9:C11 est- la formule =produitmat(A3:B5;D3:F4).

Si l’on en croit les informations proposées par Microsoft OnLine (à l'adresse http://office.microsoft.com/fr-fr/excel/HP052091811036.aspx), « PRODUITMAT renvoie l'erreur #VALEUR! » quand soit « Le nombre de colonnes de matrice1 est différent du nombre de lignes de matrice2 », soit « La taille de la matrice résultante est égale ou supérieure à un total de 5 461 cellules ».

Nous avons testé le premier cas en entrant la formule pour la matrice C dans A9:E13 au lieu de A9:C11 et constaté que les cellules excédentaires affichaient alors l'erreur « #N/A! » au lieu de l'erreur « #VALEUR! ».

Pour les 5.461 cellules, nous n’avons pas bien compris la raison de cette limite puisque cela ne tombe ni sur un carré exact (le carré le plus proche est 5.476, le carré de 74), ni près d’une puissance de 2. Ceci dit, nous avons constaté que le produit de deux matrices 73*73 se passait bien et que l’on obtenait bien l'erreur « #VALEUR! avec le produit de deux matrices 74*74.

Le seul rapport entre la limite acceptable de 5.460 cellules, un carré parfait, et une puissance de 2 est que 5.460 = 74^2 – 16 soit 74^2 – 2^2^2… Mais alors pourquoi le 74 ?

Si quelqu’un peut nous expliquer la raison de cette limite de 5.460, je suis preneur :)

3 Commentaire(s):

  • Pourquoi chercher un rapport avec un carré parfait ?

    By Blogger Zellito, sur 5:06 PM  

  • Tout simplement car il s'agit de matrices et que les matrices carrées sont des matrices typiques...

    By Blogger Hervé Thiriez, sur 8:19 AM  

  • Agaçantes ces limitations bizarres...

    Ci-joint une fonction équivalente à PRODUITMAT mais sans limitation :
    Function produitmatVB(M1 As Range, M2 As Range) As Variant
    Dim intl As Integer
    Dim intc As Integer
    Dim inte As Integer
    Dim intNbe As Integer
    Dim R() As Double
    Dim T1
    Dim T2

    ReDim R(M1.Rows.Count, M2.Columns.Count)
    T1 = M1
    T2 = M2
    intNbe = UBound(T1, 2)
    For intl = 1 To UBound(T1, 1)
    For intc = 1 To UBound(T2, 2)
    R(intl, intc) = 0#
    For inte = 1 To intNbe
    R(intl, intc) = R(intl, intc) + T1(intl, inte) * T2(inte, intc)
    Next inte
    Next intc
    Next intl
    produitmatVB = R
    End Function

    -------------------------
    (*) nécessite Option Base 1
    (**) Environ 12s pour multiplier 2 matrices carrées 256x256 sur un PC sans processeur particulièrement rapide.

    By Anonymous cduigou, sur 4:37 PM  

Enregistrer un commentaire

<< Accueil