[C] Calcul du déterminant d'une matrice [résolu] :sol

:sol [C] Calcul du déterminant d'une matrice [résolu] - C++ - Programmation

Marsh Posté le 24-12-2002 à 20:01:42    

Voilà je galère un peu, alors j'ai l'algo (c t un ex a faire):
 
On considère une matrice carrée M de dimension n, n >= 1, dont les éléments sont notés m(i,j), avec 1<=i<=n, 1<=j<=n. Le déterminant de M noté D est égal à:
 
D= m(1,1) si n=1,
   Somme de k=1 à n de : (-1)^(k+1)*m(k,1)D(k) si n>1.
 
D(k) est le déterminant d'une sous matrice de M obtenue en lui supprimant la ligne k et la colonne 1.
 
--> Ecrire une fonction C qui permet de calculer le déterminant d'une matrice carrée de dimension n.
 
----------------------------------------------------------------
Voilà ci dessus TEL QUEL l'énoncé.
 
Voici ci dessous ma fonction C (décomposé en 2 fonctions) dont je sais qu'elle est fausse car:
1- Le résultat est faux (mon determine est tjs nul)
2- Je ne sais pas comment libérer la mémoire allouer par malloc()
 
 

Code :
  1. /***************************************************************************************/
  2. //Calcul du determinant de la matrice M
  3. int determinant(int **M, int dim)
  4. {
  5. int somme = 0, **m;
  6. int i, k, taille = dim;
  7. static int compteur = 0;
  8. compteur++;
  9. printf("entree n %d dans la fonction determinant()\n", compteur);
  10. afficher(M, dim);
  11. if (taille > 1)
  12. {
  13.  for(k=0;k<taille;k++)
  14.  {
  15.   //Calcul du "sous" determinant
  16.   m = (int**)malloc(sizeof(int*)*taille-1);
  17.   for(i=0;i<taille-1;i++)
  18.    m[i] = (int*)malloc(sizeof(int)*taille-1);
  19.   initialisation_sous_matrice(m, M, k, taille);
  20.   //Cas k pair
  21.   if((k+1)%2)
  22.    somme += -1*M[k][1]*determinant(m, taille-1);
  23.   //Cas k impair
  24.   else
  25.    somme += M[k][1]*determinant(m, taille-1);
  26.  }
  27.                 //Ce qui suit est en commentaire car je ne vois pas comment déssallouer la mémoire ds un 1er tps !
  28.  /*for(i=0;i<taille-1;i++)
  29.   free(m[i]);
  30.  free (m);*/
  31. }
  32. else
  33.  return M[0][0];
  34. return somme;
  35. }
  36. /***************************************************************************************/
  37. //Calcul du sous determinant de la matrice M
  38. void initialisation_sous_matrice(int **m, int **M, int k, int taille)
  39. {
  40. int i, j, l;
  41. l = -1;
  42. for(i=0;i<taille;i++)
  43. {
  44.  if (i==k)
  45.  {
  46.   l = i-1;
  47.   continue;
  48.  }
  49.  l++;
  50.  for(j=1;j<taille;j++)
  51.   m[l][j-1] = M[i][j];
  52. }
  53. return;
  54. }


----------------------------------------------------------------
 
Comme d'hab, si vous a v des questions ou besoin de précision pour m'éclaicir sur ce code, dite le moi ;) ... parce que jsuis un peu bloqué (jmi suis penché 1H !)


Message édité par Giz le 27-12-2002 à 16:24:01
Reply

Marsh Posté le 24-12-2002 à 20:01:42   

Reply

Marsh Posté le 24-12-2002 à 23:31:19    

pkoi somme = 0 deja ??  :??:

Reply

Marsh Posté le 25-12-2002 à 20:09:34    

personne a trouvé ?  :??:

Reply

Marsh Posté le 25-12-2002 à 21:00:49    

c'est koi ce taille -1 ?


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 25-12-2002 à 21:24:47    

parce que la "sous matrice" est de taille-1 (une ligne de moins et une colonne de moins)

Reply

Marsh Posté le 25-12-2002 à 21:36:05    

si c'est un problème d'algo, j'ai pas trop envie de regarder


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 25-12-2002 à 21:41:29    

le fait est que pour calculer le déterminant, c'est bcp plus intéressant de diagonaliser la matrice plutot que de tout de suite calculer a la bourrin
 
 
paske la , la matrice 10*10, je la sens déja pas....


---------------
Bitcoin, Magical Thinking, and Political Ideology
Reply

Marsh Posté le 25-12-2002 à 21:41:40    

:non:  
l'algo est ds l'énoncé !!
c un problème de le coder en C pur ! :(

Reply

Marsh Posté le 25-12-2002 à 21:42:39    

farib a écrit :

le fait est que pour calculer le déterminant, c'est bcp plus intéressant de diagonaliser la matrice plutot que de tout de suite calculer a la bourrin
 
 
paske la , la matrice 10*10, je la sens déja pas....


 
Cai pas moi qui a fait l'énoncé desolai :D ... c l'algo qu'on m'impose c un devoir d'exam !

Reply

Marsh Posté le 25-12-2002 à 21:59:55    

ptain j'ai essayé de m'y mettre hier a 2h du mat, mais ca faisait trop mal a la tete... :wahoo:  
et today au taff, j'avais pas l'ennoncé, je vais voir  ce soir mais je promet rien !
sur ce que j'ai vu, la fontc void initialisation_sous_matrice a l'air correcte

Reply

Marsh Posté le 25-12-2002 à 21:59:55   

Reply

Marsh Posté le 25-12-2002 à 22:21:03    

zedine a écrit :

ptain j'ai essayé de m'y mettre hier a 2h du mat, mais ca faisait trop mal a la tete... :wahoo:  
et today au taff, j'avais pas l'ennoncé, je vais voir  ce soir mais je promet rien !
sur ce que j'ai vu, la fontc void initialisation_sous_matrice a l'air correcte


 
Vi tout a fait, jfais un printf de la matrice m et ca fé bien ce que je veu

Reply

Marsh Posté le 26-12-2002 à 02:26:31    

Giz a écrit :


 
 
[cpp]/     //Cas k pair
   if((k+1)%2)
    somme += -1*M[k][1]*determinant(m, taille-1);
   //Cas k impair
   else
    somme += M[k][1]*determinant(m, taille-1);
 


juste un truc, prquoi k pair donne *-1 ??  
tu pars de la 1ere ligne donc k=0, donc pair, donc c + non ?
 
 

Giz a écrit :


                //Ce qui suit est en commentaire car je ne vois pas comment déssallouer la mémoire ds un 1er tps !
  /*for(i=0;i<taille-1;i++)
   free(m[i]);
  free (m);*/


perso, je pensais plus a un  
for(0<i<n-1)
{
            for(0<j<n-1)
            {
                     free(m[i][j]);
            }
}
 
pro du c needed...

Reply

Marsh Posté le 26-12-2002 à 02:30:29    

Giz a écrit :

pkoi somme = 0 deja ??  :??:  


 
si somme egale 0, c que toutes les colones (ou lignes) ne sont pas independantes, donc un vecteur peut etre exprimé a partir de tous les autres.
info si c bien ca la question ?
 
dis moi si je me trompe plus haut, surtout a propos du *(-1) et *(+1)

Reply

Marsh Posté le 26-12-2002 à 02:35:43    

bon apres, mais c juste un detail, histoire de faire encore mieux (tu me diras, il faut deja que ca marche... :pt1cable: )
un petit plus aurai ete de faire un code pr des matrices de tout et n'importe quoi, donc prendre des void** et les caster en int au moment voulu, pour faire un code plus generique  :sol: (ptain les cours de java sur la genericité ca marque !!)

Reply

Marsh Posté le 26-12-2002 à 16:54:28    

zedine a écrit :


juste un truc, prquoi k pair donne *-1 ??  
tu pars de la 1ere ligne donc k=0, donc pair, donc c + non ?
 
 
 
perso, je pensais plus a un  
for(0<i<n-1)
{
            for(0<j<n-1)
            {
                     free(m[i][j]);
            }
}
 
pro du c needed...


 
k pair donne -1 car :
si k=2 par ex :
k+1 = 3, (k+1)%2 = 1 dc on rentre ds le if (-1) tout simplement parce que la puissance est dc impaire
 
Pour le free !  :non:
c beaucoup plus compliké :D (mais jpense avoir trouvé)


Message édité par Giz le 26-12-2002 à 16:55:30
Reply

Marsh Posté le 26-12-2002 à 16:59:15    

zedine a écrit :


 
si somme egale 0, c que toutes les colones (ou lignes) ne sont pas independantes, donc un vecteur peut etre exprimé a partir de tous les autres.
info si c bien ca la question ?
 
dis moi si je me trompe plus haut, surtout a propos du *(-1) et *(+1)


 
t'inquiete ma matrice de départ est la matrice d'identité ! (det = 1 ca j'en suis sur :D)...et dc somme de vré =lé 1 !


Message édité par Giz le 26-12-2002 à 16:59:41
Reply

Marsh Posté le 26-12-2002 à 17:01:15    

Code :
  1. for(0<i<n-1)
  2. {
  3.            for(0<j<n-1)
  4.            {
  5.                     free(m[i][j]);
  6.            }
  7. }

n'importe quoi.... tes désallocations doivent etre complement symétrique
 

Code :
  1. m=malloc(n * sizeof *m)
  2. for(i=0; i<n, ++i)
  3. {
  4.   m[i]=malloc(n * sizeof *m[i])
  5. }
  6. /* ... */
  7. for(i=0; i<n, ++i)
  8. {
  9.   free(m[i]);
  10. }
  11. free(m);


 
sinon penser aussi à l'option
 

Code :
  1. <Type>* m=malloc(n * n * sizeof <Type> ) // limite la fragmentation externe de la mémoire
  2. //fonction d'acces l'acces
  3. <Type> acces(<Type>*m, unsigned i, unsigned j)
  4. {
  5.   // verification
  6.  
  7.   return m[i*n+j]; // effectivement ça coute un petit calcul
  8. }


Message édité par Taz@PPC le 26-12-2002 à 17:01:30

---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 26-12-2002 à 17:01:42    

zedine a écrit :

bon apres, mais c juste un detail, histoire de faire encore mieux (tu me diras, il faut deja que ca marche... :pt1cable: )
un petit plus aurai ete de faire un code pr des matrices de tout et n'importe quoi, donc prendre des void** et les caster en int au moment voulu, pour faire un code plus generique  :sol: (ptain les cours de java sur la genericité ca marque !!)


 
ben si jve traiter ma matrice m fo bien convertir en int pour faire les calcul du det  :whistle: ...jte suis po la ...  :??:

Reply

Marsh Posté le 26-12-2002 à 17:06:14    

pour faire le free jsuis obligé de passé par un tableau de pointeurs dt chaque case du tablo pointeur sur une zone alloué !...et ce né SEULEMENT au changement deligne de la matrice de départ (M) lorsque k=1 par ex que je pe dessalouer toute la mémoire alouer par les sous matrices ...

Reply

Marsh Posté le 26-12-2002 à 17:07:43    

:heink: je comprends rien à ce que tu racontes: mon exemple est pourtant simple


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 26-12-2002 à 17:25:50    

Taz@PPC a écrit :

:heink: je comprends rien à ce que tu racontes: mon exemple est pourtant simple


 
ben ton exemple est celui que ja v en commentaire, ca differe en koi ?

Reply

Marsh Posté le 26-12-2002 à 17:28:36    

ben allocation et désallocation doivent etre symetrique: si tu n'alloues pas case par case, ne désalloues pas case par case


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 26-12-2002 à 17:32:50    

tu vois bien que je ne pe pas dessallouer la meme après mon malloc car la sous sous matrice depend de la sous matrice. Je ne pourré desalloué la sous matrice qu'au moment ou j'ai eu la fin de la récursivité (lorsque la sous matrice = a 1 seul chiffre) equivalent a changement de ligne par rapport a la matrice du tout départ (filé par l'utilisateur)

Reply

Marsh Posté le 26-12-2002 à 17:33:55    

Citation :

tu vois bien que je ne pe pas dessallouer la meme après mon malloc car la sous sous matrice depend de la sous matrice.


 
alors revois ta conception


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 26-12-2002 à 18:09:17    

Taz@PPC a écrit :

Citation :

tu vois bien que je ne pe pas dessallouer la meme après mon malloc car la sous sous matrice depend de la sous matrice.


 
alors revois ta conception  


 
 :non:  
moi c pa le free qui m'inquiète ! c ke somme = 0 :( ...

Reply

Marsh Posté le 26-12-2002 à 18:48:41    

je comprend pas que t'ai besoin de malloc a souhait....
 
ta matrice, tu la recopie pas  quand même ?


---------------
Bitcoin, Magical Thinking, and Political Ideology
Reply

Marsh Posté le 26-12-2002 à 19:00:00    

farib a écrit :

je comprend pas que t'ai besoin de malloc a souhait....
 
ta matrice, tu la recopie pas  quand même ?


 
ben écoute si on pars d'une matrice 4*4, la prochaine sera un "tablo" a 2 dimensions (passé en argument a la fonction determinant()) de 3*3 puis 2*2 puis 1*1 ... au final, je ne pe passé de tablo de taille fixe !! car la taille change en permanence...d'ou passage par les pointeurs (allocation memoire dynamique de tablo a 2 dimension via malloc())

Reply

Marsh Posté le 26-12-2002 à 19:11:18    

:pfff:


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 26-12-2002 à 19:26:15    

Reply

Marsh Posté le 26-12-2002 à 19:29:30    

Giz a écrit :


 
ben écoute si on pars d'une matrice 4*4, la prochaine sera un "tablo" a 2 dimensions (passé en argument a la fonction determinant()) de 3*3 puis 2*2 puis 1*1 ... au final, je ne pe passé de tablo de taille fixe !! car la taille change en permanence...d'ou passage par les pointeurs (allocation memoire dynamique de tablo a 2 dimension via malloc())


 
tu fais bcp plus simple
 
 
ta fonction déterminant, tu lui passes comme argument un pointeur vers la matrice originale, et les numéros de ligne et de colonne que tu supprimes !
 
tu évites de recopier, ca ca ne sert à rien !


---------------
Bitcoin, Magical Thinking, and Political Ideology
Reply

Marsh Posté le 26-12-2002 à 19:30:47    

ton problème d'allocation est un problème: le mieux c'est de libérer des que tu n'en as plus besoin pour soulager ton système.
 
ca peut etre joliment réalisé par une approche objet.
 
sinon, tu peux mémoriser toutes les allocations que tu as faites (soit en copiant des pointeurs dans des variables de sauvegarde, soit plus élégant dans un tableau/ liste et tout nettoyer proprement.)
 
mais préoccupes toid e ce problème. si tu n'arrives pas à le résoudre, c'est significatif d'une autre complexité dans ton programme. reprends simplement ton problème du début, deroules un peu à la main et c adevrait passer non d'un chien  :D


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 26-12-2002 à 19:30:54    

a la limite fais deux tableau de dimension 1, de  taile n pour les lignes/colonnes a supprimer


---------------
Bitcoin, Magical Thinking, and Political Ideology
Reply

Marsh Posté le 26-12-2002 à 19:31:26    

Taz@PPC a écrit :

ton problème d'allocation est un problème: le mieux c'est de libérer des que tu n'en as plus besoin pour soulager ton système.
 
ca peut etre joliment réalisé par une approche objet.
 
sinon, tu peux mémoriser toutes les allocations que tu as faites (soit en copiant des pointeurs dans des variables de sauvegarde, soit plus élégant dans un tableau/ liste et tout nettoyer proprement.)
 
mais préoccupes toid e ce problème. si tu n'arrives pas à le résoudre, c'est significatif d'une autre complexité dans ton programme. reprends simplement ton problème du début, deroules un peu à la main et c adevrait passer non d'un chien  :D  


 
il a pas besoin de tant allouer !


---------------
Bitcoin, Magical Thinking, and Political Ideology
Reply

Marsh Posté le 26-12-2002 à 19:40:50    

le problème c'est que ta fonction boucle en permanence et allou à gogo
 
petit exemple: le det d'une 3x3, c'est 3 det de 2*2. pas la peine de créer toutes les 2x2 nécessaire. fais tes 3 appels recursifs sur une portion de la matrice initiale en jouant sur la taille de la sous matrice, en bougeant des pointeurs, etc.
 
si tu n'y arrives pas, reviens au solutions déjà donnée.
 
etant donné que tu ne fais pas de programmation concurrente, tu peux aussi tres bien envisager de créer un matric ede "de travail": tu ne modifies jamais ta matrice passer en paramètre et tu te sers de cette matrice temporaire et tu la désalloue
 
 
det(m, n)
{
  matrice_temporaire bien allouée
   
  // autant de fois
  remplissage de matrice_temporaire
   
  appel_recursif de det(matrice_temporaire, n-1)
                ou
  procéder iteratif  
 
  liberer matrice_temporaire
}
 
 
afin que seul la fonction appelante en premier libére la matrice_temporaire (dans une approche recursive), tu peux :rajouter un paramètre à det ou utiliser une vraiable statique (commune a toutes les fonctions (static int suis_je_la_premiere)


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 26-12-2002 à 19:53:10    

Taz@PPC a écrit :

le problème c'est que ta fonction boucle en permanence et allou à gogo
 
petit exemple: le det d'une 3x3, c'est 3 det de 2*2. pas la peine de créer toutes les 2x2 nécessaire. fais tes 3 appels recursifs sur une portion de la matrice initiale en jouant sur la taille de la sous matrice, en bougeant des pointeurs, etc.
 
 


 
c'est marrant, c'est ce que je dis depuis quelques posts  :pfff:  :pfff:


---------------
Bitcoin, Magical Thinking, and Political Ideology
Reply

Marsh Posté le 26-12-2002 à 19:54:15    

ben vi je reprends ton idée: mais comme il semble pas comprendre.... :bounce:  :bounce:  :bounce:


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 26-12-2002 à 19:56:47    

de toute facon, même le prof d'info est con, car il impose un des algos les plus betes....


---------------
Bitcoin, Magical Thinking, and Political Ideology
Reply

Marsh Posté le 26-12-2002 à 19:58:07    

:cry:


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 26-12-2002 à 20:19:25    

farib a écrit :


 
tu fais bcp plus simple
 
 
ta fonction déterminant, tu lui passes comme argument un pointeur vers la matrice originale, et les numéros de ligne et de colonne que tu supprimes !
 
tu évites de recopier, ca ca ne sert à rien !


 
mais au 1er appel j'ai rien a supprimer, juste a passer la matrice de départ :D

Reply

Marsh Posté le 26-12-2002 à 20:21:18    

farib a écrit :


 
il a pas besoin de tant allouer !


 
Rien a foutre de l'optimisation c un sujet d'examen !! ... le but c ke ca marche !  :fou:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed