begin process at 2010 02 10 13:16:21
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > INVERSION DE MATRICE

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];
            }
        
       }
	}
}



 Sources de la même categorie

Source avec Zip OPERATION SUR LES MATRICES CARREES AVEC CLASSE GENERIQUE par chouhad
Source avec une capture OPÉRATIONS SUR MATRICES C++ par Minilogus
[DEV-C++] CALCUL DE LA RACINE CARRÉE D'UN RÉEL par Jhep
PROGRAMME QUI CALCUL LE PPCM ET LE PGCD par AnoSantino
EVALUER UNE EXPRESSION MATHÉMATIQUE par begueradj

 Sources en rapport avec celle ci

Source avec Zip MATRICE ZIGZAG par Mjj_Yuna
MIN-MAX D'UNE MATRICE par Bigthune
Source avec Zip CLASS MATRICE AVEC TEMPLATE par CharSnipeur
Source avec Zip SQUELETTE DE MOTEUR 3D par _michel
ALGORITHME DE GAUSS-JORDAN par hasnaoui_karim

Commentaires et avis

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.

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....

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...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,498 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales