Inversion de matrices

Soyez le premier à donner votre avis sur cette source.

Snippet vu 30 334 fois - Téléchargée 33 fois

Contenu du snippet

Ce code permet de trouver l'inverse d'une matrice. L'intérêt est qu'il utilise la méthode de Gauss (échelonner-réduire) au lieu du calcul du déterminant, des cofacteurs... Ceci permet d'avoir une complexité polynomiale en N, et non exponentielle, mais enfin pour être clair : ça va beaucoup plus vite pour les grandes matrices !

Source / Exemple :


option base 1

Private Sub MsgErrBox(ByVal Message As String)
    MsgBox Message, vbCritical, "Inversion de matrices"
    End
End Sub

Private Function InverseMatrice(ByRef Matrice() As Double) As Double()
Dim i As Integer, j As Integer, k As Integer
Dim n As Integer
Dim M() As Double, MInv() As Double
Dim Temp As Double

    n = UBound(Matrice, 1)
    
    ' vérifie que la matrice est une matrice carrée
    If UBound(Matrice, 2) <> n Then MsgErrBox "La matrice n'est pas carrée !"
    
    ' crée la matrice n x 2n, composée par M et la matrice identité
    ReDim M(n, 2 * n)
    For i = 1 To n
        For j = 1 To n
            M(i, j) = Matrice(i, j)
            M(i, j + n) = 1 - Sgn(Abs(i - j))
        Next
    Next
    
    ' échelonne la matrice M()
    For i = 1 To n
        ' trouve le pivot (1er élément <> 0)
        j = i
        While M(j, i) = 0
            j = j + 1
            If j > n Then MsgErrBox "La matrice n'est pas inversible !"
        Wend
        ' échange les 2 lignes si elles sont différentes
        ' commence à partir de l'élément i, car tous les précédents sont nuls
        If i <> j Then
            For k = i To 2 * n
                Temp = M(i, k)
                M(i, k) = M(j, k)
                M(j, k) = Temp
            Next
        End If
        ' le pivot devient égal à 1
        If M(i, i) <> 1 Then
            Temp = M(i, i)
            For j = i To 2 * n
                M(i, j) = M(i, j) / Temp
            Next
        End If
        ' sous le pivot, tous les éléments deviennent nuls
        For j = i + 1 To n
            If M(j, i) <> 0 Then
                Temp = M(j, i)
                For k = i To 2 * n
                    M(j, k) = M(j, k) - M(i, k) * Temp
                Next
            End If
        Next
    Next
    
    ' réduit la matrice M()
    For i = n To 2 Step -1
        For j = 1 To i - 1
            If M(j, i) <> 0 Then
                Temp = M(j, i)
                For k = i To 2 * n
                    M(j, k) = M(j, k) - M(i, k) * Temp
                Next
            End If
        Next
    Next
        
    ' retourne le résultat : la deuxième partie de la matrice M()
    ReDim MInv(n, n)
    For i = 1 To n
        For j = 1 To n
            MInv(i, j) = M(i, j + n)
        Next
    Next
    InverseMatrice = MInv
    
End Function

A voir également

Ajouter un commentaire

Commentaires

Je n'avais pas envie de (re)créer un truc dont j'étais certain qu'il avait été fait quelque part. J'ai pioché ce morceau de code, je viens de le tester (même si je n'ai pas encore tout débroussaillé), et ça marche au top.

Merci pour ce partage, je gagne des heures/jours/semaines de programmation et de tests.
Messages postés
8
Date d'inscription
jeudi 15 mars 2012
Statut
Membre
Dernière intervention
9 décembre 2013

Merci !!

Marche très bien pour les grandes matrices (testé avec 840*840)
Messages postés
221
Date d'inscription
vendredi 30 novembre 2001
Statut
Membre
Dernière intervention
13 février 2010
4
sympa ton commentaire Marco_stock ! Je ne fréquente plus ce site, mais j'y passe quand même une fois tous les deux ans... :-S
Messages postés
1
Date d'inscription
mercredi 7 juin 2006
Statut
Membre
Dernière intervention
10 mai 2011

Superbe !!! Je ne sais pas si le créateur fréquente encore le forum, mais à tous ceux qui souhaitent l'utiliser, n'hésitez pas !!!
Messages postés
221
Date d'inscription
vendredi 30 novembre 2001
Statut
Membre
Dernière intervention
13 février 2010
4
la fonction n'affiche rien, en effet. Il suffit simplement de déclarer 2 tableaux, disons A et B, n'importe où dans le code, définir les valeurs de A, puis appeler la fonction :
B = InverseMatrice(A)
Tous les coefficients de la matrice inverse peuvent ensuite être récupérés dans B :
debug.print B(i,j)
Afficher les 14 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.