Inversion de matrice

gyzmo1 Messages postés 13 Date d'inscription samedi 29 novembre 2003 Statut Membre Dernière intervention 9 juillet 2004 - 29 avril 2004 à 17:45
vacadam Messages postés 1 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 24 août 2004 - 24 août 2004 à 15:13
Salut à tous, g un problème concernant les matrice. J utilise l algorithme de Greville pour inverser ma matrice, le pb ce que cette méthode utilise la division par la norme de colonne. Or sur de grosses matrices cette norme est vraiment grande, ce qui a pour concéquence de ramener pratiquement tous les resultats a zéro et d'ainsi fausser totalement le resultat. Je voudrais savoir si qq'1 connait une parade ou si qq'1 connait une autre méthode.
je joint mon code pour ceux qui connaisse !
void Matrice::Calc_Greville(Matrice &Greville)
{
float troncature=0;
int i,var=0,k,j,L1,C1;
L1=Ligne;
C1=Colonne;
Matrice MatM, MatM2, Bk, Ck, Dk, MatM3;

//algo de greville initialisation
for (i=0;i<L1;i++)
if(Mat[i][0]!=0) var++;

if (var==0)
{
for (i=0;i<L1;i++)
Greville.Mat[0][i]=0;
}
else
{
if (MatM.Ligne !=0)
MatM.desalloue();
MatM.Alloue(1,L1);
Transpose(L1,1,MatM);
Matrice temporaire=Matrice(this);
Matrice MatV=Matrice(1,1);
MatM.Matricemul(temporaire,1,L1,L1,1,MatV);
temporaire.desalloue();
MatV.Mat[0][0]=1/MatV.Mat[0][0];

Matrice MatN=Matrice(1,L1);
MatV.Matricemul(MatM,1,1,1,L1,MatN);
for(i=0;i<1;i++)
{
for(j=0;j<L1;j++)
Greville.Mat[i][j]=MatN.Mat[i][j];
}

MatN.desalloue();
MatV.desalloue();
MatM.desalloue();
}

/*FIN DE L4INITIALISATION ET LIBERATION DE mATv ET mATm*/

for (k=1;k<C1;k++)
{

/*calcul de Dk= A(+ k-1)*ak*/
Matrice MatM1=Matrice(L1,1);

for (i=0;i<L1;i++)
MatM1.Mat[i][0]=Mat[i][k];

if (Dk.Ligne != 0)
Dk.desalloue();
Dk.Alloue(k,1);
Greville.Matricemul(MatM1,k,L1,L1,1,Dk);

/*calcul de Ck*/
if (Ck.Ligne != 0)
Ck.desalloue();
Ck.Alloue(L1,1);
Matricemul(Dk,L1,k,k,1,Ck);

for(i=0;i<L1;i++)
Ck.Mat[i][0]=MatM1.Mat[i][0]-Ck.Mat[i][0];

/*calcul de Bk*/
MatM1.desalloue();

var=0;
/*la troncature permet de considerer une valeur de
Ck comme nulle si celle ci est inferieur à 10^-5*/
for (i=0;i<L1;i++)
{
troncature=Ck.Mat[i][0]*100000;
if((int)troncature!=0)
var++;
}

if (var!=0)
{
MatM2.Alloue(1,L1);
Ck.Transpose(L1,1,MatM2);

Matrice MatV2 = Matrice(1,1);
MatM2.Matricemul(Ck,1,L1,L1,1,MatV2);
MatV2.Mat[0][0]=1/MatV2.Mat[0][0];

if(Bk.Ligne != 0)
Bk.desalloue();
Bk.Alloue(1,L1);
MatV2.Matricemul(MatM2,1,1,1,L1,Bk);

MatV2.desalloue();
MatM2.desalloue();
}
else
{
MatM2.Alloue(1,k);
Dk.Transpose(k,1,MatM2);
Matrice MatV2 = Matrice(1,1);
MatM2.Matricemul(Dk,1,k,k,1,MatV2);
MatV2.Mat[0][0]=1/(MatV2.Mat[0][0]+1);

Matrice MatN2 = Matrice(1,L1);
MatM2.Matricemul(Greville,1,k,k,L1,MatN2);

Bk.Alloue(1,L1);
MatV2.Matricemul(MatN2,1,1,1,L1,Bk);

MatN2.desalloue();
MatV2.desalloue();
MatM2.desalloue();
}

/* on rempli maintenant Greville */
if (MatM3.Ligne != 0)
MatM3.desalloue();
MatM3.Alloue(k,L1);
Dk.Matricemul(Bk,k,1,1,L1,MatM3);

for(i=0;i<k;i++)
for(j=0;j<L1;j++)
Greville.Mat[i][j]=Greville.Mat[i][j]-MatM3.Mat[i][j];

for(i=0;i<L1;i++)
Greville.Mat[k][i]=Bk.Mat[0][i];
}
Dk.desalloue();
Ck.desalloue();
Bk.desalloue();
MatM2.desalloue();
MatM3.desalloue();
MatM.desalloue();

return;

}

1 réponse

vacadam Messages postés 1 Date d'inscription vendredi 27 décembre 2002 Statut Membre Dernière intervention 24 août 2004 1
24 août 2004 à 15:13
et bah c pas gagner Greville apparament
1
Rejoignez-nous