Inversion de matrice

Soyez le premier à donner votre avis sur cette source.

Snippet vu 35 456 fois - Téléchargée 22 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
maupertuit Messages postés 1 Date d'inscription lundi 21 avril 2008 Statut Membre Dernière intervention 8 octobre 2008
8 oct. 2008 à 13:57
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;
}
vinc1008881 Messages postés 257 Date d'inscription dimanche 22 août 2004 Statut Membre Dernière intervention 29 septembre 2010 3
15 juil. 2007 à 20:23
"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....
grogan_17 Messages postés 2 Date d'inscription lundi 13 octobre 2003 Statut Membre Dernière intervention 15 avril 2007
15 avril 2007 à 22:17
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.