Multiplication matrice [Matrice c++]

joshua69 Messages postés 2 Date d'inscription dimanche 27 mai 2012 Statut Membre Dernière intervention 28 mai 2012 - 27 mai 2012 à 23:03
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 - 28 mai 2012 à 21:52
Bonjour,

je dois réaliser un algorithme utilisant la méthode de Cholesky pour la décomposition en matrice L.Lt. voici mon code:


#include <QtCore/QCoreApplication>
#include
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <float.h>

using namespace std;

//*************Déclaration d'une matrice******************//
int **allouer_matrice (int ligne, int colonne)

{
int i;

int **matrice = new int *[ligne];

for(i=0;i<ligne;i++)
{
matrice [i]= new int [colonne];
}

if(matrice == NULL)
{
exit(EXIT_FAILURE);
}

return matrice;
}


//************Remplir une matrice **********************//

void remplir_matrice (int ligne, int colonne, int **matrice)

{
int i,j;

for(i=0;i<ligne;i++)
{
for(j=0;j<colonne;j++)
{
cout<<"Rentrez la valeur de m "<> matrice [i][j];
}
}
}

//*****************Affichage matrice *******************//

void afficher_Matrice(int ligne,int colonne,int **matrice)

{
int i,j;

for(i=0;i<ligne;i++)
{
for(j=0;j<colonne;j++)
{
cout<< matrice [i][j]<<"\t";
}
cout<< endl;
}
}

//*****************Matrice Nulle *************************//

void matrice_nulle (int ligne, int colonne, int **matrice)

{
int i,j;

for(i=0;i<ligne;i++)
{
for(j=0;j<colonne;j++)
{
matrice [i][j]=0;
}
}
}

//*****************Désallocation mémoire matrice **********//

void vider_matrice(int **matrice)

{
delete[] matrice;

}


//***************Transposer une matrice********************//

void transposer_matrice(int **matrice1, int **matrice2, int ligne, int colonne)

{
int i,j ;

for(i=0; i<ligne; i++)

{
for(j=0; j<colonne; j++)

{
matrice2[j][i] = matrice1[i][j];
}
}
}

//***************Algorithme de Cholesky ********************//

void algo_cholesky(int ligne, int colonne, int **matrice_A)

{
int i,j,k;
float S;

double **matrice_L=allouer_matrice(ligne, colonne);
double **matrice_Lt=allouer_matrice(ligne,colonne);
matrice_nulle(ligne, colonne, matrice_L);
matrice_nulle(ligne, colonne, matrice_Lt);

for(i=0;i<=ligne;i++)

{
S=0;
for(j=0;j> lignes;
cout<<"Tapez le nombre de colonnes de la matrice" << endl;
cin >> colonnes;

int **matrices1= NULL;
int **matrices2= NULL;

matrices1 = allouer_matrice (lignes, colonnes);

remplir_matrice (lignes, colonnes, matrices1);

cout<< "\nLa matrice obtenue est la suivante :"<<endl;

afficher_Matrice(lignes, colonnes, matrices1);


algo_cholesky(lignes, colonnes, matrices1);

}


Je rencontre alors un problème concernant le sous programme "algo_cholesky". En effet, le programme compile bien, mais la fenêtre console plante lorsque le programme atteint la ligne " S+=pow(matrice_L[i][j],2)". J'ai beau chercher sur google mais aucune solution ne répond à mon problème. Merci de me faire part de vos idées.

A bientôt.

Joshua

3 réponses

yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
28 mai 2012 à 11:54
Salut,

Pour supprimer ta matrice,
le delete[] matrice; ne suffit pas (2 new = 2 delete)

Pour ta question, je pense que tes boucles devraient utiliser < ligne et pas < = ligne puisque tu démarres à 0.

for(i=0;i<=ligne;i++)
0
joshua69 Messages postés 2 Date d'inscription dimanche 27 mai 2012 Statut Membre Dernière intervention 28 mai 2012
28 mai 2012 à 13:53
Merci pour ta réponse, mais le code ne fonctionne toujours pas. J'ai bien changé l'inégalité en inégalité strict mais la console plante toujours au moment de l’exécution de la ligne "S+=pow(matrice_L[i][j],2)" (toutes les autres fonctions marchent).

Merci pour ton aide.
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
28 mai 2012 à 21:52
Re,

Je ne comprends pas certaines choses dans ton algo,

1: la variable k n'est jamais initialisée, cela doit provoquer une erreur

2 : les boucles imbriquées partagent le même indice i qui je pense devrait etre local dans la 2eme boucle ? sinon au retour à la boucle principale, le i à varié ?

Sinon, pour le delete, il faut faire :

void vider_matrice(int **matrice, int ligne) 
{ 
for(int i=0;i<ligne;i++) 
{ 
delete[] matrice[i];
} 
delete[] matrice; 
} 
0
Rejoignez-nous