Salut à tous,
j'ai écrit un petit algorithme de Gauss-Jordan pour l'inversion matricielle.
le pb est qu'il y a des risques de divisions par zéros
par exemple, lorsque l'on veut normaliser à cette étape :
1 2 3 4 | 3 2 7 5
0 1 5 3 | 4 9 5 1
0 0 0 3 | 2 5 7 4
0 0 5 2 | 2 4 9 4
j'ai donc insérer une recherche sur le maximum (en valeur absolue)... pour qu'ici, par exemple, les 2 dernières lignes soient inversées
je n'ai trouvé ça nulle part sur internet, ce qui m'étonne un peu. Est-ce qu'on peut éventuellement faire autrement, et est-ce que c'est utile (d'autant que ça peut prendre un certain temps pour les grandes matrices) ?
code correspondant, sorti de tout contexte (mais testé) :
nbp est le nombre de paramètres
deriv2 est la matrice à inverser (matrice essienne nbp x nbp)
derinv est la matrice que deviendra, à la fin de l'algorithme, la matrice inverse (nbp x nbp également)
Code :
- // recherche du coef max
- max = 0;
- for (j = i ; j <= nbp ; j++) {
- temp = abs(deriv2[j][i]);
- if (temp > max) {lmax = j ; max = temp;}
- } // fin de recherche du coef max
- // echange des 2 lignes
- for (j = i ; j <= nbp ; j++) {
- temp = deriv2[i][j];
- deriv2[i][j] = deriv2[lmax][j];
- deriv2[lmax][j] = temp;
- }
- for (j = 1 ; j <= nbp ; j++) {
- temp = derinv[i][j];
- derinv[i][j] = derinv[lmax][j];
- derinv[lmax][j] = temp;
- } // fin d'echange des 2 lignes
|
P.S. : je viens de me rendre compte que je n'ai mis aucune condition sur l'échange de ligne, qui est particulièrement inutile si il n'y a rien à échanger...
... j'ai en plus bien conscience que je prend de la mémoire inutilement en n'utilisant pas l'indice 0 des tableaux 
Message édité par jimipage le 18-01-2006 à 22:47:36
---------------
un perlien qui programme salement