:sol [C] Calcul du déterminant d'une matrice [résolu] - C++ - Programmation
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)
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....
Marsh Posté le 25-12-2002 à 21:41:40
l'algo est ds l'énoncé !!
c un problème de le coder en C pur !
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 |
Cai pas moi qui a fait l'énoncé desolai ... c l'algo qu'on m'impose c un devoir d'exam !
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...
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
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... |
Vi tout a fait, jfais un printf de la matrice m et ca fé bien ce que je veu
Marsh Posté le 26-12-2002 à 02:26:31
Giz a écrit : |
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 : |
perso, je pensais plus a un
for(0<i<n-1)
{
for(0<j<n-1)
{
free(m[i][j]);
}
}
pro du c needed...
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)
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... )
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 (ptain les cours de java sur la genericité ca marque !!)
Marsh Posté le 26-12-2002 à 16:54:28
zedine a écrit : |
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 !
c beaucoup plus compliké (mais jpense avoir trouvé)
Marsh Posté le 26-12-2002 à 16:59:15
zedine a écrit : |
t'inquiete ma matrice de départ est la matrice d'identité ! (det = 1 ca j'en suis sur )...et dc somme de vré =lé 1 !
Marsh Posté le 26-12-2002 à 17:01:15
Code :
|
n'importe quoi.... tes désallocations doivent etre complement symétrique
Code :
|
sinon penser aussi à l'option
Code :
|
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... ) |
ben si jve traiter ma matrice m fo bien convertir en int pour faire les calcul du det ...jte suis po la ...
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 ...
Marsh Posté le 26-12-2002 à 17:25:50
Taz@PPC a écrit : 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 ?
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)
Marsh Posté le 26-12-2002 à 18:09:17
Taz@PPC a écrit :
|
moi c pa le free qui m'inquiète ! c ke somme = 0 ...
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 ?
Marsh Posté le 26-12-2002 à 19:00:00
farib a écrit : je comprend pas que t'ai besoin de malloc a souhait.... |
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())
Marsh Posté le 26-12-2002 à 19:29:30
Giz 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 !
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
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
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. |
il a pas besoin de tant allouer !
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)
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 |
c'est marrant, c'est ce que je dis depuis quelques posts
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....
Marsh Posté le 26-12-2002 à 20:19:25
farib a écrit : |
mais au 1er appel j'ai rien a supprimer, juste a passer la matrice de départ
Marsh Posté le 26-12-2002 à 20:21:18
farib a écrit : |
Rien a foutre de l'optimisation c un sujet d'examen !! ... le but c ke ca marche !
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()
----------------------------------------------------------------
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