Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
880 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

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

n°275636
Giz
Posté le 24-12-2002 à 20:01:42  profilanswer
 

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
mood
Publicité
Posté le 24-12-2002 à 20:01:42  profilanswer
 

n°275648
Giz
Posté le 24-12-2002 à 23:31:19  profilanswer
 

pkoi somme = 0 deja ??  :??:

n°275761
Giz
Posté le 25-12-2002 à 20:09:34  profilanswer
 

personne a trouvé ?  :??:

n°275777
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 25-12-2002 à 21:00:49  profilanswer
 

c'est koi ce taille -1 ?


---------------
du bon usage de rand [C] / [C++]
n°275783
Giz
Posté le 25-12-2002 à 21:24:47  profilanswer
 

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

n°275788
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 25-12-2002 à 21:36:05  profilanswer
 

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


---------------
du bon usage de rand [C] / [C++]
n°275790
farib
Posté le 25-12-2002 à 21:41:29  profilanswer
 

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
n°275791
Giz
Posté le 25-12-2002 à 21:41:40  profilanswer
 

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

n°275792
Giz
Posté le 25-12-2002 à 21:42:39  profilanswer
 

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 !

n°275795
Profil sup​primé
Posté le 25-12-2002 à 21:59:55  answer
 

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

mood
Publicité
Posté le 25-12-2002 à 21:59:55  profilanswer
 

n°275801
Giz
Posté le 25-12-2002 à 22:21:03  profilanswer
 

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

n°275827
Profil sup​primé
Posté le 26-12-2002 à 02:26:31  answer
 

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...

n°275828
Profil sup​primé
Posté le 26-12-2002 à 02:30:29  answer
 

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)

n°275829
Profil sup​primé
Posté le 26-12-2002 à 02:35:43  answer
 

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 !!)

n°276095
Giz
Posté le 26-12-2002 à 16:54:28  profilanswer
 

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
n°276097
Giz
Posté le 26-12-2002 à 16:59:15  profilanswer
 

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
n°276100
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 26-12-2002 à 17:01:15  profilanswer
 

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++]
n°276101
Giz
Posté le 26-12-2002 à 17:01:42  profilanswer
 

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 ...  :??:

n°276106
Giz
Posté le 26-12-2002 à 17:06:14  profilanswer
 

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 ...

n°276107
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 26-12-2002 à 17:07:43  profilanswer
 

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


---------------
du bon usage de rand [C] / [C++]
n°276112
Giz
Posté le 26-12-2002 à 17:25:50  profilanswer
 

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 ?

n°276114
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 26-12-2002 à 17:28:36  profilanswer
 

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++]
n°276115
Giz
Posté le 26-12-2002 à 17:32:50  profilanswer
 

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)

n°276116
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 26-12-2002 à 17:33:55  profilanswer
 

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++]
n°276127
Giz
Posté le 26-12-2002 à 18:09:17  profilanswer
 

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 :( ...

n°276140
farib
Posté le 26-12-2002 à 18:48:41  profilanswer
 

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
n°276143
Giz
Posté le 26-12-2002 à 19:00:00  profilanswer
 

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())

n°276146
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 26-12-2002 à 19:11:18  profilanswer
 

:pfff:


---------------
du bon usage de rand [C] / [C++]
n°276154
Giz
Posté le 26-12-2002 à 19:26:15  profilanswer
 
n°276155
farib
Posté le 26-12-2002 à 19:29:30  profilanswer
 

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
n°276156
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 26-12-2002 à 19:30:47  profilanswer
 

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++]
n°276157
farib
Posté le 26-12-2002 à 19:30:54  profilanswer
 

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


---------------
Bitcoin, Magical Thinking, and Political Ideology
n°276158
farib
Posté le 26-12-2002 à 19:31:26  profilanswer
 

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
n°276164
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 26-12-2002 à 19:40:50  profilanswer
 

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++]
n°276174
farib
Posté le 26-12-2002 à 19:53:10  profilanswer
 

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
n°276176
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 26-12-2002 à 19:54:15  profilanswer
 

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


---------------
du bon usage de rand [C] / [C++]
n°276179
farib
Posté le 26-12-2002 à 19:56:47  profilanswer
 

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
n°276180
Taz@PPC
saloperie de i=`expr $i + 1`;
Posté le 26-12-2002 à 19:58:07  profilanswer
 

:cry:


---------------
du bon usage de rand [C] / [C++]
n°276183
Giz
Posté le 26-12-2002 à 20:19:25  profilanswer
 

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

n°276184
Giz
Posté le 26-12-2002 à 20:21:18  profilanswer
 

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:

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
[Java] Convertir un String en un Object Color [Résolu][Java] Rechercher un String dans un autre String [Résolu]
[Java] Occuper plusieurs cases dans un GridLayout? [Résolu][Java] Conversion int,double <-> object est ce possible? [Résolu]
probleme de <SELECT> et présélection d'une value [RESOLU]ident failed for user machin?? d'où ça vient (Postgres inside)[résolu]
[C] Liste chainée que j'arrive pas à parcourir [resolu]Calcul volume d'une page php envoyée
[résolu - C & Linux] Compilation du C sous Mandrake[Java / Swing] Boite de dialogue avec JDialog ? [Résolu]
Plus de sujets relatifs à : [C] Calcul du déterminant d'une matrice [résolu] :sol


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR