Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

INVERSION DE MATRICE


Information sur la source



Description

Ce code permet d'inverser une matrice carrée (la modification du code pour une matrice non carrée est pas très difficile) qui doit au moins être diagonale (pas de zéro sur la diagonale).

La fonction reçoit en paramètre la matrice (Mat) et la taille de celle-ci (NbElement). Le résultat est remis dans la matrice fournie en paramètre.
 

Source

  • void InvdiagMat(int NbElement, float **Mat)
  • {
  • float ** temp;
  • int i;
  • temp=new float*[NbElement];
  • for(i=0;i<NbElement;i++)
  • {
  • temp[i]=new float [NbElement];
  • for(int j=0;j<NbElement;j++)
  • {
  • temp[i][j]=0;
  • }
  • }
  • for(i=0;i<NbElement;i++)
  • {
  • for(int j=0;j<NbElement;j++)
  • {
  • temp[i][i]=1/Mat[i][i];
  • if(j!=i)
  • {
  • temp[i][j]=-Mat[i][j]/Mat[i][i];
  • }
  • for(int k=0;k<NbElement;k++)
  • {
  • if(k!=i)
  • {
  • temp[k][i]=Mat[k][i]/Mat[i][i];
  • }
  • if(j!=i &&k!=i)
  • {
  • temp[k][j]=Mat[k][j]-Mat[i][j]*Mat[k][i]/Mat[i][i];
  • }
  • }
  • }
  • for(int i=0;i<NbElement;i++)
  • {
  • for(int j=0;j<NbElement;j++)
  • {
  • Mat[i][j]=temp[i][j];
  • }
  • }
  • }
  • }
void InvdiagMat(int NbElement, float **Mat)
{
	float ** temp;
	int i;
	temp=new float*[NbElement];
	for(i=0;i<NbElement;i++)
	{
		temp[i]=new float [NbElement];
		for(int j=0;j<NbElement;j++)
		{
			temp[i][j]=0;
		}
	}

	for(i=0;i<NbElement;i++)
    {
	 	
	 	for(int j=0;j<NbElement;j++)
		{
		 		temp[i][i]=1/Mat[i][i];
		 		if(j!=i)
	    		{
					temp[i][j]=-Mat[i][j]/Mat[i][i];
				}
		 		for(int k=0;k<NbElement;k++)
		 		{
		 		    
					if(k!=i)
					{
		 			 		temp[k][i]=Mat[k][i]/Mat[i][i];
					}
					if(j!=i &&k!=i)
					{
					 		temp[k][j]=Mat[k][j]-Mat[i][j]*Mat[k][i]/Mat[i][i];
                    }		
				}
			 		
		}
		for(int i=0;i<NbElement;i++)
    	{
            for(int j=0;j<NbElement;j++)
            {
                Mat[i][j]=temp[i][j];
            }
        
       }
	}
}

Commentaires et avis

signaler à un administrateur
Commentaire de grogan_17 le 15/04/2007 22:17:57

Juste comme ça, très théoriquement... je crois pas que tu sois capable de modifier ton code pour inverser les matrices non-carrées car elle ne s'inverse pas vraiment. En effet, une matrice est inversible si et seulement si son déterminant est non-nulle. Donc, elle doit avoir un déterminant. Cette notion n'est cependant pas définie pour les matrices non-carrées.

signaler à un administrateur
Commentaire de vinc1008881 le 15/07/2007 20:23:43

"Ce code permet d'inverser une matrice carrée (la modification du code pour une matrice non carrée est pas très difficile) qui doit au moins être diagonale (pas de zéro sur la diagonale)."

Je n'ai jamais vu de matrice rectangle (non carré) diagonales....

signaler à un administrateur
Commentaire de maupertuit le 08/10/2008 13:57:46

Ton code à l'air fonctionnel, par contre juste une modif ou deux:
* il manque les delete
* si tu alloues une matrice, alloue les données dans un vecteur continu, ca sera plus rapide à l'excution.

void InvdiagMat(int NbElement, float *MatVect)
{
   int sizeBuffer=NbElement*NbElement;

   float **Mat=new float*[NbElement];
   for(int i=0;i<NbElement;++i)
      Mat[i]=&MatVect[i*NbElement];

   bool testDiag=true;
   for(int i=0;i<NbElement;++i)
      if(Mat[i][i]==0)
      {
         testDiag=false;
         break;
      }

      if(testDiag)
      {
         float *  tmpVect=new float[sizeBuffer];
         float ** temp=new float*[NbElement];
         for(int i=0;i<NbElement;i++)
            temp[i]=&tmpVect[i*NbElement];

         for(int i=0;i<sizeBuffer;i++)
            tmpVect[i]=0.0f;



         for(int i=0;i<NbElement;i++)
         {

            for(int j=0;j<NbElement;j++)
            {
               temp[i][i]=1/Mat[i][i];
               if(j!=i) temp[i][j]=-Mat[i][j]/Mat[i][i];

               for(int k=0;k<NbElement;k++)
               {

                  if(k!=i) temp[k][i]=Mat[k][i]/Mat[i][i];

                  if(j!=i &&k!=i)
                     temp[k][j]=Mat[k][j]-Mat[i][j]*Mat[k][i]/Mat[i][i];
               }

            }

            for(int i=0;i<NbElement;i++)
               for(int j=0;j<NbElement;j++)
                  Mat[i][j]=temp[i][j];


         }

         delete temp;
         delete tmpVect;
      }
      delete Mat;
}

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Inversion de matrice [ par Aekq ] Salut,J'ai besoin de code d'inversion de matrice de dimension (30x30). Inversion de matrices [ par Stubbornman ] Bonjour a tous, Mon probleme est le suivant: je cherche à inverser une matrice de taille tres importante (environ 2000x2000), malheureusement, mon al copie par bloc d'une matrice avec vc++ [ par sousou_one ] salut,est ce que quelqu'un peut m'aider &#224; copier une matrice par bloc sous visual c++, sous Matlab je fais :N([0 : h],[0 : k]) = M([x : x+h],[y : matrice inverse [ par vladisback ] bonjour, j'utilise pour mes transformation des matrices 4x3: Xx Yx Zx Tx Xy Yy Zy Ty Xz Yz Zz Tz (Identique au matrice directX excepté une quatrieme Hessien d'une matrice [ par anne-lise ] Bonjour, je recherche des codes sources ou algorithmes simples pour calculer le Hessien d'une matrice donn&#233;e. Mercizezette Deplacement dans le repere de la Camera [ par xabila ] bonjour,voil&#224; j'ai une camera qui est defini avec un vec translation tx ty tzet une rotation h p rj'anrrive bien a recuperer la matrice 3*3 corre matrices et c++ [ par anne-lise ] Bonjour, je debute en c++ et j'ai quelques problemes avec les tableaux... D'abord, y a t'il un moyen d'avoir pour resultat d'une fonction un tableau ? Position et Orientation -> matrice 4*4 [ par xabila ] Bonjour, je voudrais savoir comment &#224; partir d'une position dans l'espace d'un objet avec son orientation, donc un vecteur 3f on arrive &#224; s Langage C(niveau débutant): tableaux et pointeurs [ par DeltaX ] Bonjour &#224; tous.J'ai trouv&#233; ce site par hazard et esp&#232;re que quelqu'un aura quelques secondes pour m'aider, mon niveau &#233;tant tr&#23 Matrice dynamique mal allouée [ par wolflinger ] Bonjour, Je souhaite cr&#233;er une matrice dynamique de type (int **Mat) en C. Mais j'ai un soucis &#224; l'allocation de m&#233;moire. Voici mon co


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,390 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.