grogan_17
Messages postés2Date d'inscriptionlundi 13 octobre 2003StatutMembreDernière intervention15 avril 2007
-
15 avril 2007 à 22:17
maupertuit
Messages postés1Date d'inscriptionlundi 21 avril 2008StatutMembreDernière intervention 8 octobre 2008
-
8 oct. 2008 à 13:57
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
maupertuit
Messages postés1Date d'inscriptionlundi 21 avril 2008StatutMembreDerniè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;
vinc1008881
Messages postés257Date d'inscriptiondimanche 22 août 2004StatutMembreDernière intervention29 septembre 20103 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és2Date d'inscriptionlundi 13 octobre 2003StatutMembreDernière intervention15 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.
8 oct. 2008 à 13:57
* 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;
}
15 juil. 2007 à 20:23
Je n'ai jamais vu de matrice rectangle (non carré) diagonales....
15 avril 2007 à 22:17