CommentCaMarche
Recherche
Posez votre question Signaler

Calcul de l'inverse d'une matrice

Maz - Dernière réponse le 5 nov. 2011 à 00:48
salut! j'ai besoin d'écrire une fonction en langage C qui calcul l'inverse d'une matrice quelquonce
je n'arrive pas a trouvé l'algorithme
si quelq'un peut m'aider
urgence signalé
merci
Lire la suite 
Réponse
+12
moins plus
template <class T>MATRIX<T>& MATRIX<T>::inverse()
           {
           if (m!=n)
               {
               __ENVOI("inversion de matrices non carré non implémenter!\n");
               return *this;
               }
           MATRIX<T> MM(n),M1(n),Mi1(n),Minv(n);
           MM=*this;
           M1=MM;
           Mi1.Id();
           Minv=Mi1;
           for (int i=0;i<n;i++)
             {
             for (int j=0;j<n;j++)
                 {
                 if (MM(i,i)==0)
                    {
                    __ENVOI("inversion pivot GAUSS impossible : division par 0\n");
                    return *this;
                    }
                 M1(i,j)=MM(i,j)/MM(i,i);
                 Mi1(i,j)=Minv(i,j)/(MM(i,i));
                 }
             MM=M1;
             Minv=Mi1;
             for (int k=0;k<n;k++)// mise zéros de la colonne
             if (k!=i)
             for (int j=0;j<n;j++)
                 {
                 M1(k,j)=MM(k,j)-MM(i,j)*MM(k,i);
                 Mi1(k,j)=Minv(k,j)-Minv(i,j)*MM(k,i);
                 }
             MM=M1;
             Minv=Mi1;
             /*for (int k=0;k<n;k++)//mise à zéro de la ligne. ap essai : pas la peine
             if (k!=i)
             for (int j=0;j<n;j++)
                 {
                 M1(j,k)=MM(j,k)-MM(i,j)*MM(i,k);
                 Mi1(j,k)=Minv(j,k)-Minv(i,j)*MM(i,k);
                 }
             MM=M1;
             Minv=Mi1;*/
             }
           *this=Minv;
           return *this;
           }
ça inverse n'importe quel matrice carré.
précision c'est un morceau d'une classe matrice dont un des membre est la fonction inverse(). n et m sont les dimensions lignes colonnes de la matrice, Id() est une méthode qui transfiorme la matrice en matrice identité. __ENVOI() est une macro qui permet de faire des sorties et de la gestion d'erreur. à par ça, je pense que le reste du code na pas besoin d'explications.
Ajouter un commentaire
Réponse
+3
moins plus
C'est du C++ en effet, mais c'est vraiment pas compliquer !
je te fait des simplifications :
MATRIX& MATRIX::inverse()
           {
           if (m!=n)
               {
               perror("inversion de matrices non carré non implémenter!\n");
               return *this;
               }
           MATRIX MM(n),M1(n),Mi1(n),Minv(n);// déclaration de matrices de taille identique à celle à inverser
           MM=*this;// copie de la matrice à inverser
           M1=MM;
           Mi1.Id();//Mi1 est maintenant une matrice identité
           Minv=Mi1;
           for (int i=0;i<n;i++)
             {
             for (int j=0;j<n;j++)
                 {
                 if (MM(i,i)==0)
                    {
                    perror("inversion pivot GAUSS impossible : division par 0\n");
                    return *this;
                    }
                 M1(i,j)=MM(i,j)/MM(i,i);
                 Mi1(i,j)=Minv(i,j)/(MM(i,i));
                 }
             MM=M1;
             Minv=Mi1;
             for (int k=0;k<n;k++)// mise zéros de la colonne
             if (k!=i)
             for (int j=0;j<n;j++)
                 {
                 M1(k,j)=MM(k,j)-MM(i,j)*MM(k,i);
                 Mi1(k,j)=Minv(k,j)-Minv(i,j)*MM(k,i);
                 }
             MM=M1;
             Minv=Mi1;
            
             }
           *this=Minv;
           return *this;
           }
Voilà. La il est difficile de faire plus simple. C'est vraiment du basique ! Dit ce que tu ne comprend pas, ça ira mieux
Char Snipeur 8888Messages postés vendredi 23 avril 2004Date d'inscription ContributeurStatut 24 mars 2015Dernière intervention - 9 nov. 2009 à 10:45
Ma classe matrice est visible sur mon site (regarde mon profil).
http://pagesperso-orange.fr/celine-julien/julien/prog/matriceV5.h
Tu devrais pourvoir comparer.
Si tu détecte un problème, dit le moi, ça m'intéresse.
Répondre
christiankamewe 14Messages postés dimanche 8 novembre 2009Date d'inscription 19 novembre 2009Dernière intervention - 9 nov. 2009 à 11:32
effectivement , en ce qui concerne la fonction Id pour la matrice identité , je me rends compte que tu mets uniquement les éléments de la diagonale à 1.0 et qu'en est il des autres éléments qui doivent passer à 0.
Répondre
Char Snipeur 8888Messages postés vendredi 23 avril 2004Date d'inscription ContributeurStatut 24 mars 2015Dernière intervention - 9 nov. 2009 à 12:25
Oui, j'avais trouvé ce bug, et je l'ai corrigé (il faut que je mette à jour le site). Mais normalement ce n'est pas grave dans l'algorithme d'inversion car les matrice mises à l'identité sont nulles.
Répondre
christiankamewe 14Messages postés dimanche 8 novembre 2009Date d'inscription 19 novembre 2009Dernière intervention - 9 nov. 2009 à 12:33
ok , deuxiement quand tu fais MM(i,i)==0.0 qu'es ce que cela veut dire? est ce que tu sais regarder mon code, particulierement celui de la fonction inverse et me dire où il peut y avoir problème?
Répondre
Char Snipeur 8888Messages postés vendredi 23 avril 2004Date d'inscription ContributeurStatut 24 mars 2015Dernière intervention Char Snipeur - 9 nov. 2009 à 12:58
Je ne vois pas d'erreur.
Vérifie la composition de tes matrices avant d'entrer dans la première boucle.
As tu testé mon code ?
Comment vérifie tu que ta matrice est bien inversée ? (attentions aux erreurs numériques)
Répondre
Ajouter un commentaire
Réponse
+2
moins plus
je pourais t'aider si tu veut mais tu doit me dire le fonctionement que tu ve faire parceque je me souvien pas bcp des matrice.
exemple :
l'utilisateure saisi 3 nombre le prog fait la somme et afiche le resultat
s2m3ouia- 22 mai 2008 à 11:21
salut! j'ai besoin d'écrire une fonction en langage pascal qui calcul l'inverse d'une matrice quelquonce
si tu peut m'aider urgence signalé
merci
Répondre
Char Snipeur 8888Messages postés vendredi 23 avril 2004Date d'inscription ContributeurStatut 24 mars 2015Dernière intervention - 22 mai 2008 à 11:57
Tu as l'algo message 4 écris en C++ sans template. Il ne doit pas être trop dur à traduire en pascal !
Répondre
Ajouter un commentaire
Réponse
+2
moins plus
Bonjour
voila , un tres bon site pour les gens qui manipule les matrice
http://wims.unicaen.fr/...
Ajouter un commentaire
Réponse
+2
moins plus
MATRIX& MATRIX::inverse()
{
if (m!=n)
{
perror("inversion de matrices non carré non implémenter!\n");
return *this;
}
MATRIX MM(n),M1(n),Mi1(n),Minv(n);// déclaration de matrices de taille identique à celle à inverser
MM=*this;// copie de la matrice à inverser
M1=MM;
Mi1.Id();//Mi1 est maintenant une matrice identité
Minv=Mi1;
for (int i=0;i<n;i++)
{
for (int j=0;j<n;j++)
{
if (MM(i,i)==0)
{
perror("inversion pivot GAUSS impossible : division par 0\n");
return *this;
}
M1(i,j)=MM(i,j)/MM(i,i);
Mi1(i,j)=Minv(i,j)/(MM(i,i));
}
MM=M1;
Minv=Mi1;
for (int k=0;k<n;k++)// mise zéros de la colonne
if (k!=i)
for (int j=0;j<n;j++)
{
M1(k,j)=MM(k,j)-MM(i,j)*MM(k,i);
Mi1(k,j)=Minv(k,j)-Minv(i,j)*MM(k,i);
}
MM=M1;
Minv=Mi1;

}
*this=Minv;
return *this;
}
Char Snipeur 8888Messages postés vendredi 23 avril 2004Date d'inscription ContributeurStatut 24 mars 2015Dernière intervention - 30 avril 2008 à 08:39
pourquoi réécrire ça ?
Répondre
Ajouter un commentaire
Réponse
+2
moins plus
slt S.V.P vus puvez m'aider pour le calcule ledeterminant d'une matricz carée c'est pourresudre un ystemed'equation avecla methode decramer .merci à tousle monde
Ajouter un commentaire
Réponse
+1
moins plus
la question était sur l'algorithme d'une inversion de matrice pas le code en entier. Pour afficher et exécuté, il faut faire le programme qui va autour, donc voir sur autre messages.
Précision sur l'algorithme présenté ici, il s'agit de l'inversion par pivot de Gauss. La méthode consiste à prendre deux matrice, celle à inverser MM et une matricve identité Mi1. Ensuite, on applique différentes opérations à la matrice à inverser afin de la faire devenir identité. En même temps, les mêmes opérations sont appliquées à la matrice identité. à la fin, la matrice initialement identité est l'inverse cherché.
Ajouter un commentaire
Réponse
+1
moins plus
qu'est-ce que vous voulez dire au début:
if (m!=n)?
vous utilisé plusieurs fois! "!" est-ce que c'est factoriel?
Ajouter un commentaire
Réponse
+1
moins plus
hum... une petite recherche sur le langage C/C++ te permettrai de répondre à cette question.
le ! est tout simplement le not logique. Et encore, là ce n'est pas '!', mais '!=', c'est à dire différent.
a!=b est équivalent à !(a==b)
Ajouter un commentaire
Réponse
+1
moins plus
svp j ai besoin d'aide je ss encore debutante g besoin de resoudre cet algo : ecrire un algo qui permet de calculer le produit C(n,n) de deux matrices carré A(n,n) et B(n,n) sachant que : Ci,j=la somme de k=1 jusqu'à n ai,k*bk,j svp c urgent!!!!!!!!!!!!!
Mish- 4 févr. 2009 à 04:08
Voilà comment calculer un produit matriciel de type Amn * Bnp. C'est en JavaScript, c'est-à-dire un language pour faire des pages web... Il n'y a rien de plus simple. Vous copiez-collez dans bloc-notes, et vous enregistrez... Testé sous IE7. Désolé pour l'indentation irrégulière.

<html><body><textarea cols="40" rows="20" id="test"></textarea><script language="javascript">

function MISHTeK_Maths_Matrix_MatrixProduct(a,b)
{
dataA=MISHTeK_Maths_Matrix_Props(a);
if(dataA==-1)
return -1;
dataB=MISHTeK_Maths_Matrix_Props(b);
if(dataB==-1)
return -1;
if(dataA[0]!=dataB[1]) //Matrix product requieres this to be false, since sizes would be mismatching.
return -1;
var buffer=MISHTeK_Maths_Matrix_Create(dataA[1],dataB[0]);
for(j=0;j<dataA[1];j++) //Matrix a's height (for row)
for(i=0;i<dataB[0];i++) //Matrix b's width (for column)
{
//i and j specifies the location in the new matrix, while k is acting as Sigma's (sum operator) iterator.
buffer[i][j]=0;
for(k=0;k<dataA[0];k++) //Matrix a's width or b's height (same by definition)
buffer[i][j]+=a[i][k]*b[k][j];
}
return buffer;
}
function MISHTeK_Maths_Matrix_Format(mtrx)
{
data=MISHTeK_Maths_Matrix_Props(mtrx);
if(data==-1)
return -1;
var space="";
for(i=0;i<data[2]-1;i++)
space+=" ";
var buffer="";
for(j=0;j<data[1];j++)
{
buffer+="[";
for(i=0;i<data[0];i++)
{
buffer+=space.substring(0,data[2]-String(mtrx[j][i]).length)+mtrx[j][i];
if(i+1<data[0])
buffer+=" ";
}
buffer+="]";
if(j+1<data[1])
buffer+="\r\n";
}
return buffer;
}
function MISHTeK_Maths_Matrix_Create(w,h,v)
{
var buffer=new Array(h);
for(i=0;i<h;i++)
{
buffer[i]=new Array(w);
for(j=0;j<w;j++)
buffer[i][j]=v;
}
return buffer;
}
function MISHTeK_Maths_Matrix_Props(mtrx)
{
if(!MISHTeK_Maths_Matrix_IsValidMatrix(mtrx))
return -1;
var buffer=new Array(mtrx[0].length,mtrx.length,0); //width, height, max column width
for(i=0;i<mtrx.length;i++)
for(j=0;j<mtrx[0].length;j++)
if(String(mtrx[i][j]).length>buffer[2])
buffer[2]=String(mtrx[i][j]).length;
return buffer;
}
function MISHTeK_Maths_Matrix_IsValidMatrix(mtrx)
{
if(mtrx.length==undefined)
return false;
for(i=0;i<mtrx.length;i++)
{
if(mtrx[i].length!=mtrx[0].length)
return false;
for(j=0;j<mtrx[0].length;j++)
if(mtrx[i][j]==undefined || String(mtrx[i][j])=="")
return false;
}
return true;
}

function Test()
{
var Mtrx1=new Array(new Array(1,2),new Array(3,4));
var Mtrx2=new Array(new Array(5,6),new Array(7,8));
var Mtrx3=MISHTeK_Maths_Matrix_MatrixProduct(Mtrx1,Mtrx2);
document.getElementById("test").value=MISHTeK_Maths_Matrix_Format(Mtrx3);
}
</script></body></html>

Et voilà.

Pour faire fonctionner, remplacer la section en gras par votre matrice. Le premier new Array est nécessaire, il consitue l'ensemble des lignes de la matrice. Pour trois lignes, il faut mettre trois new Array() dans le new Array principal. Puis, il faut mettre des chiffres dans chaque new Array secondaire. Par défaut, il a a une matrice de 2x2 qui s'afficherait comme ceci :
[1  2]
[3  4]


La réponse du calcul s'affiche dans le textarea. Désolé encore une fois pour le code bâtard, mais je l'ai copié d'une de mes librairies de calcul matriciel, et s'aurait été vraiment trop long...
Répondre
Ajouter un commentaire
Réponse
+1
moins plus
slt ,svp si vous pouver m'aider de me donner l'algorithme en pascal qui me permet de calculer le determinant d'une matrice n*n (je veut pas l'idee mais le programm complet svp)

merci à tous
Ajouter un commentaire
Réponse
+1
moins plus
svp g besoin de l'algo qui fais l'inverce d'une matrice mais l'algo non pa le programme car je ne metrise pa le c++ urgentttttttttt
auto- 11 déc. 2008 à 00:46
c simple ta le program , prend n'importe kel matrice inversible ( det#0 ) , une matrice 2*2 c simple ....remplace dans le program que ta (mm en c c pa grave ).... (é sur une feuille bien sur ) suit le étape par étape é là tu poura déduir l'algorythme
Répondre
amazigh- 26 sept. 2010 à 20:35
ou bien vous utilisez la comatrice pour calcuer l'inverse de n'import quelle matrice carré tel que det#0
Répondre
Ajouter un commentaire
Réponse
+1
moins plus
svp je cherche un programme de calcul matricielle tel que le produit matricielle et le calcul de l'inverse d'une matrice qui soit adaptable avec ma calculatrice c'est une casio graph25 merci pour votre aide
nidhaljemaia- 5 nov. 2011 à 00:48
svp kk1 puvé m aidé a trouver un code sur fortran qui calcule le comatrice
Répondre
Ajouter un commentaire
Réponse
+0
moins plus
salut les gens, j'avoue ne pas avoir tres bien compris le fonctionnement de cet algorithme car mes connaissances en C restent assez elementaire ,alors une solutino plus facile a comprendre serait la bienvenue, merci d'avance , et merci a sniper
Ajouter un commentaire
Réponse
+0
moins plus
Mais, ou et comment exécuter le programme (Si c'est sur C, comment y proceder) sinon ou voir les résultats.
Ajouter un commentaire
Réponse
+0
moins plus
svp g besoin pour m'aider à réaliser un programme en pascal qui affiche et calcul le determinant d'une matrice. je sais pas comment on peut afficher la matrice. merci d'avance
Ajouter un commentaire
Réponse
+0
moins plus
pour afficher en pascal, Writeln.
Toujours est il que ce genre de question doit être ouverte dans un nouveau message.
Merci
Ajouter un commentaire
Réponse
+0
moins plus
salu svp j cherche solution de( algorithme de la somme d'une diagonale d'une matrice carre)
Ajouter un commentaire
Ce document intitulé «  calcul de l'inverse d'une matrice  » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.