Calcul d'une matrice inverse en C++
rif59
Messages postés
41
Date d'inscription
Statut
Membre
Dernière intervention
-
pl0t -
pl0t -
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;
}
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;
}
A voir également:
- Calcul d'une matrice inverse en C++
- Annuaire inversé - Guide
- Ecran inversé - Guide
- Calcul moyenne excel - Guide
- Annuaire inversé suisse ✓ - Forum Mail
- Annuaire inverse espagne - Forum Mobile
4 réponses
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...
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 ??
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
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
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.