Calcul d'une matrice inverse en C++

Fermé
rif59 Messages postés 41 Date d'inscription mercredi 27 février 2008 Statut Membre Dernière intervention 16 novembre 2008 - 21 juin 2008 à 02:08
 pl0t - 25 sept. 2009 à 15:41
Bonjour,
je souhaite calculer l'inverse d'une matrice carrée 5x5; j'ai fé un programme en C++, mais ça marche pas, est ke quelqu'un peut corriger cet algorithme. et merci d'avance . voila le programme

#include "stdafx.h"
#include <iostream>
#include <math.h>

using namespace std;

void mat_inver(double Mat[5][5],double matinver[5][5]) {
int i,j;
for (i=0;i<5;i++){
for ( j=0;j<5;j++){
matinver[i][j]=0;
} }
for (i=0;i<5;i++){
for ( int j=0;j<5;j++){
matinver[i][i]=1/Mat[i][i];
if (j!=i) {
matinver[i][j]=-Mat[i][j]/Mat[i][i];
}
for ( int k=0;k<5;k++){
if (k!=i)
{
matinver[k][i]=Mat[k][i]/Mat[i][i];
}
if (j!=i &&k!=i)
{
matinver[k][j]=Mat[k][j]-Mat[i][j]*Mat[k][i]/Mat[i][i];
} } }
for ( int i=0;i<5;i++)
{
for ( int j=0;j<5;j++)
{
Mat[i][j]=matinver[i][j];
}}}}
int main (){
double mat[5][5];double mat1[5][5];
mat[1][1]=3; mat[1][2]=2; mat[1][3]=5; mat[1][4]=1 ; mat[1][5]=7;

mat[2][1]=1; mat[2][2]=4; mat[2][3]=0; mat[2][4]=6 ; mat[2][5]=4;

mat[3][1]=9; mat[3][2]=5; mat[3][3]=8; mat[3][4]=2; mat[3][5]=1;

mat[4][1]=6; mat[4][2]=1; mat[4][3]=3; mat[4][4]=4; mat[4][5]=6;

mat[5][1]=8; mat[5][2]=7; mat[5][3]=10; mat[5][4]=0; mat[5][5]=1;

cout<<mat[1][1]<<" "<<mat[1][2]<<" "<<mat[1][3]<<" "<<mat[1][4]<<" "<<mat[1][5]<<endl;
cout<<mat[2][1]<<" "<<mat[2][2]<<" "<<mat[2][3]<<" "<<mat[2][4]<<" "<<mat[2][5]<<endl;
cout<<mat[3][1]<<" "<<mat[3][2]<<" "<<mat[3][3]<<" "<<mat[3][4]<<" "<<mat[3][5]<<endl;
cout<<mat[4][1]<<" "<<mat[4][2]<<" "<<mat[4][3]<<" "<<mat[4][4]<<" "<<mat[4][5]<<endl;
cout<<mat[5][1]<<" "<<mat[5][2]<<" "<<mat[5][3]<<" "<<mat[5][4]<<" "<<mat[5][5]<<"\n"<<endl;


mat_inver(mat1, mat);

cout<<mat1[1][1]<<" "<<mat1[1][2]<<" "<<mat1[1][3]<<" "<<mat1[1][4]<<" "<<mat1[1][5]<<endl;
cout<<mat1[2][1]<<" "<<mat1[2][2]<<" "<<mat1[2][3]<<" "<<mat1[2][4]<<" "<<mat1[2][5]<<endl;
cout<<mat1[3][1]<<" "<<mat1[3][2]<<" "<<mat1[3][3]<<" "<<mat1[3][4]<<" "<<mat1[3][5]<<endl;
cout<<mat1[4][1]<<" "<<mat1[4][2]<<" "<<mat1[4][3]<<" "<<mat1[4][4]<<" "<<mat1[4][5]<<endl;
cout<<mat1[5][1]<<" "<<mat1[5][2]<<" "<<mat1[5][3]<<" "<<mat1[5][4]<<" "<<mat1[5][5]<<"\n"<<endl;
}

4 réponses

Utilisateur anonyme
21 juin 2008 à 02:45
Petite remarque : tu appelles la fonction mat_inv mais elle ne te retourne rien, tous les calculs sont effectués sur les variables locales Mat et matinver, donc pas étonnant que ça marche pas en sortie, mat1 n'est jamais modifiée...
1
rif59 Messages postés 41 Date d'inscription mercredi 27 février 2008 Statut Membre Dernière intervention 16 novembre 2008 1
21 juin 2008 à 13:43
merci;
si je mis mat_inver(mat,mat1); sa marche pa aussi;
0
Utilisateur anonyme
21 juin 2008 à 13:45
Ben normal t'as rien changé au problème posé :/
0
rif59 Messages postés 41 Date d'inscription mercredi 27 février 2008 Statut Membre Dernière intervention 16 novembre 2008 1
21 juin 2008 à 13:49
en fait je suis debutant en C++, et je voi pas koi changer; tu peut me dire k'est ce ke je doit changer; et est ke la structure est bonne ??
0
Utilisateur anonyme
21 juin 2008 à 13:54
Pas besoin d'avoir des connaissances en C++ pour comprendre : tu appelles ta fonction mat_inv qui va inverser les matrices passées en arguments, mais tous les traitements sont faits localement ; quand tu reviens dans la fonction main(), mat1 n'a pas été modifiée, donc l'inverse n'a pas été calculée.
Avant de te lancer dans la programmation copiée/collée, lis des cours de C++, au moins les bases, c'est le minimum : http://casteyde.christian.free.fr/cpp/cours/online/book1.html
0
est ce ke quelqu'un d'autre a une reponse plus claire que celles de doob.merci d'avance.
0
La réponse de boob est très simple. Juste lorsque tu passes une variable en paramètre d'une fonction il y a recopie de la variable pour créer une variable locale à la fonction et cette copie est effacé à la sortie de la fonction ( cf mécanisme d'empilement d'appel de fonction). La solution pour permettre la pérénité des modifications une fois sortie de la fonction est de passé tes paramètres par pointeur.
0