Puissance d'une matrice en C

tudjo Messages postés 1 Date d'inscription   Statut Membre Dernière intervention   -  
tatou_38 Messages postés 1937 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
Je dois coder une fonction, A->A^k, mon code est celui ci :

void puissancek (mat A, mat &Z, int k, int n)
{identite(Z,n);
for (int s=1; s<=k; s++)
{
double ak;
for (int i=1; i<=n; i++)
for (int j=1; j<=n; j++)
{ak=0;
for (int t=1; t<=n; t++)
{
ak=ak+A[i][t]*Z[t][j];
Z[i][j]=ak;
}
}
}
}

J'ai beau tourné le problène dans plusieurs sens ca ne fonctionne pas. Ce qui est tres bête c'est que mon opérateur "fois" fonctionne :

void fois (mat A, mat C, mat &X, int n)
{ double acij=0;
for (int i=1; i<=n; i++)
for (int j=1; j<=n; j++)
{acij=0;
for (int k=1; k<=n; k++)
acij=acij+A[i][k]*C[k][j];
X[i][j]=acij;
}
}

Mais je ne sais pas l'incorporer à "puissancek".

J'utilise seulement les bibliothèque iostream.h et math.h.

En vous remerciant d'avance.

3 réponses

Pacorabanix Messages postés 3248 Date d'inscription   Statut Membre Dernière intervention   663
 
Bonjour,


Concernant ton problème : Je n'ai pas particulièrement bien lu ton code. Mais ce que j'ai compris : tu calcules simplement une puissance de matrice en la multipliant plusieurs fois avec elle-même (il est posssible de beaucoup simplifier ce calcul, mais ça demande un peu de maths ;) ).

Donc ma suggestion est celle-ci : réutilises ta fonction "fois" ! (puisqu'elle marche bien).

(Vérifier que k est une valeur correcte !)

Z = identité( ... );
Pour i = 1 jusqu'a k
faire Z = fois ( Z, A, Z, ...)
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
salut, m'étonne pas que ça fonctionne pas, tu altèe Z trop tôt et tu le réutilise.
Du coup tu peux pas avoir le bon résultat.
Si tu veux utiliser fois(), il suffit de le déclarer avant puissance.
Sinon, regarde là, un fichier permettant la plupart des opérations avec les matrices :
http://mapage.noos.fr/julien.lamome/prog/matriceV5.h
0
tatou_38 Messages postés 1937 Date d'inscription   Statut Membre Dernière intervention   121
 
Juste une remarque, en C les tableaux commencent à l'indice 0, aussi tu devrais plutôt faire tes boucles de la façon suivante :

for ( i = 0 ; i < n ; i++ ) { .... }

Car le risque est de déborder de ton tableau au dernier élément, en effet si tu as déclaré un tableau, par ex : int tableau[10] , le dernier élément sera tableau[9] et tu risque fort un crash si tu touches à tanleau[10] !

Sinon je ne me rapelle pas trop le calcul matriciel, mais ton code me parait bizarre.
0