begin process at 2012 02 09 16:13:29
  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 UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture HDR EXPOSURE FUSION par mecrosoft
Source avec Zip Source avec une capture CLASS MATRICE C++ par elkasimi2007
CALCULER LE PRODUIT DE DEUX MATRICES DE TAILLE DIFFERENT par aymenet1
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 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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,544 sec (3)

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