Inversion de matrice

Soyez le premier à donner votre avis sur cette source.

Snippet vu 25 212 fois - Téléchargée 20 fois

Contenu du snippet

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 / Exemple :


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

A voir également

Ajouter un commentaire

Commentaires

Messages postés
1
Date d'inscription
lundi 21 avril 2008
Statut
Membre
Dernière intervention
8 octobre 2008

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;
}
Messages postés
257
Date d'inscription
dimanche 22 août 2004
Statut
Membre
Dernière intervention
29 septembre 2010
1
"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....
Messages postés
2
Date d'inscription
lundi 13 octobre 2003
Statut
Membre
Dernière intervention
15 avril 2007

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.

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 et codes sources.

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