Calcul matrice

Jerome91270

XLDnaute Nouveau
Bonjour à tous,

Etant débutant, j'ai besoin de votre aide car je suis complètement bloqué.

J'ai une feuille de calcul dans laquelle j'ai une Matrice M 3x3 de type colonne.

Le but est de calculer une puissance n de cette Matrice en faisant varier les coefficients.

Jusque là pas de problème:
Je rentre manuellement mes coefficients dans la Matrice M, je rentre la variable n et excel me calcul M^n (grâce à un code VBA que j'ai trouvé sur google). ça fonctionne.

Le hic, c'est que j'ai un tableau de données (Tableau 1) qui me donne les coefficients sur une même ligne. Exemple: ligne 1 du Tableau 1, je vais avoir les 3 coefficients de la colonne 1, suivi des 3 coefficients de la colonne 2 et suivi des 3 coefficients de la colonne 3. Le tout donc sur une même ligne.

Les résultats doivent être reportés (dans le Tableau 2) également sur une même ligne: les coefficients de la colonne 1, suivi de colonne 2, suivi de colonne 3.

Etant donné que je vais avoir un très grand nombre de matrice à calculer, il est impossible de rentrer à la main les coefficients du Tableau 1 pour chaque matrice et de reporter ensuite toujours manuellement les résultats dans le Tableau 2.

Comment faire pour faire rentrer les coefficients du Tableau 1 automatiquement dans la Matrice M et d'avoir le résultats dans le Tableau 2? A chaque ligne du Tableau 1 correspond une nouvelle matrice à calculer, et chaque ligne du Tableau 2 est le résultats correspondant.

J'espère ne pas trop être flou...

En tout cas, merci d'avance pour votre aide très précieuse!!

En pj, le fichier correspondant.

Jérôme
 

Pièces jointes

  • calcul matrice.xls
    44.5 KB · Affichages: 35

job75

XLDnaute Barbatruc
Re,

Cette solution est plus logique et le calcul bien plus rapide :
Code:
Function Resu(P As Range, puissance)
Dim t, matrice, i%
t = P 'matrice, plus rapide
ReDim matrice(2, 2) '3 x 3 en base 0
For i = 1 To 9
  matrice((i - 1) Mod 3, Int((i - 1) / 3)) = t(1, i)
Next
matrice = puissancemat(matrice, puissance) 'passe en base 1
For i = 1 To 9
  t(1, i) = matrice(1 + (i - 1) Mod 3, 1 + Int((i - 1) / 3))
Next
Resu = t
End Function
La formule =Resu(B15:J15;G$3) est à valider matriciellement sur toute la plage M15:U15.

Fichier (3).

Edit : j'ai testé avec des tableaux de 10 000 lignes, sur Win 10 - Excel 2013.

Le fichier (1) se recalcule en 2,44 seconde, le fichier (2) en 1,96 seconde, le fichier (3) en 0,52 seconde.

A+
 

Pièces jointes

  • calcul matrice(3).xls
    79.5 KB · Affichages: 22
Dernière édition:

Jerome91270

XLDnaute Nouveau
Alors là, bravo!! C'est très simple et très souple d'utilisation et aussi très rapide!
Il faut valider comme tu le dis la première plage matriciellement et dès qu'on rajoute une ligne à calculer, il suffit juste de "tirer" la plage vers la bas pour avoir le résultat. Que demander de plus? :)
Par curiosité, peux tu envoyer les tests que tu as fait sur 10000 lignes stp?
 

job75

XLDnaute Barbatruc
Re,

Voyez les 2 fichiers joints.

Pour le 1er fichier j'ai rendu la fonction volatile pour qu'elle se recalcule avec l'instruction Calculate.

A+
 

Pièces jointes

  • calcul matrice test 10000 lignes(1).xls
    4.3 MB · Affichages: 20
  • calcul matrice 6 x 6(1).xls
    86.5 KB · Affichages: 29

Jerome91270

XLDnaute Nouveau
C'est énorme!!! ça marche du tonnerre! :) :) :)

Un grand merci à Hieu et à Job75, vos deux systèmes fonctionnent parfaitement, mais pour le Big Data, à mon avis celui de Job75 est plus adapté car beaucoup plus rapide.
Vous m'avez fait gagné un temps colossal!!
Encore merci à vous deux.

Jérôme
 

job75

XLDnaute Barbatruc
Bonjour Jerome91270, le forum,

Avec les fichiers joints on n'a plus rien à faire pour mettre à jour le 2ème tableau.

Je constate que les durées d'exécution varient un coup sur deux, je ne sais pas pourquoi.

Bonne journée.
 

Pièces jointes

  • calcul matrice 3 x 3 10000 lignes(1).xls
    1.1 MB · Affichages: 14
  • calcul matrice 6 x 6 10000 lignes(1).xls
    2.6 MB · Affichages: 17

job75

XLDnaute Barbatruc
Re,

Non ce n'est pas curieux c'est parce que matrice est définie en base 0.

Si n = 1 matrice n'est pas transformée en base 1, ce qu'attend la 2ème boucle de la fonction.

Alors définir matrice en base 1, fichiers (2).

A+
 

Pièces jointes

  • calcul matrice 3 x 3 10000 lignes(2).xls
    1.1 MB · Affichages: 15
  • calcul matrice 6 x 6 10000 lignes(2).xls
    2.6 MB · Affichages: 16

Jerome91270

XLDnaute Nouveau
oui ça fonctionne à présent, merci!
Et enfin, sans vouloir abuser, est-il possible d'insérer une colonne vierge en A, on décale tout vers la droite d'une colonne.
J'ai essayé mais ça change apparement beaucoup de paramètre dans le code et je fais tout planter...
 

job75

XLDnaute Barbatruc
Bonjour Jerme91270, le forum,

Pour les cas de puissances < 0 (matrice inverse) ou nulles (matrice unité) :
Code:
Function puissancemat(matrice, puissance)
Dim i, ub
If puissance < 0 Then matrice = WorksheetFunction.MInverse(matrice): puissance = -puissance
puissancemat = matrice
If puissance Then
  For i = 1 To puissance - 1
    puissancemat = WorksheetFunction.MMult(puissancemat, matrice)
  Next
Else
  ub = UBound(puissancemat)
  ReDim matrice(1 To ub, 1 To ub)
  For i = 1 To ub
    matrice(i, i) = 1
  Next
  puissancemat = matrice
End If
End Function
Fichiers (3), j'ai inséré une colonne A vierge comme vous le souhaitez.

Bonne journée.
 

Pièces jointes

  • calcul matrice 3 x 3 10000 lignes(3).xls
    1.1 MB · Affichages: 24
  • calcul matrice 6 x 6 10000 lignes(3).xls
    2.6 MB · Affichages: 16

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 861
Messages
2 092 963
Membres
105 572
dernier inscrit
Anna17