Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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

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

Dernière édition:
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?
 
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
 
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

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

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...
 
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

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
2
Affichages
288
Réponses
1
Affichages
90
  • Question Question
Microsoft 365 Traitement
Réponses
7
Affichages
131
Retour