CLASS MATRICE EFFICACE

Messages postés
492
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2012
- - Dernière réponse : Menuki
Messages postés
13
Date d'inscription
lundi 10 octobre 2005
Statut
Membre
Dernière intervention
11 août 2008
- 11 août 2008 à 12:55
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/47364-class-matrice-efficace

Menuki
Messages postés
13
Date d'inscription
lundi 10 octobre 2005
Statut
Membre
Dernière intervention
11 août 2008
-
Bonjour,

Juste une petite question :
Pourquoi tu ajoutes 1 au nombre d'entrées allouées dans le tableau?

exemple : ligne 240 => mat = new double[column * line + 1];

J'ai regardé en vitesse mais je n'ai pas trouvé où cette dernière valeur était utilisée.


Une deuxième remarque qui se rapporte un peu à la première :

Le test pour savoir si l'indice dans le tableau (opérateur []) est dans les limites est celui-ci :
if (i < 0 || i > (m_m * m_n)) throw ERROR_INVALID_PARAM;

Hors les indices valides sont entre 0 et m_m*m_n-1.
Si on admet que la valeur supplémentaire allouée ne sert à rien (et donc qu'on la supprime), il faut mettre un >= à la place du >

Me goure-je?



Sinon, j'aime bien ta classe. Ca semble rapide.
J'aurais préféré que l'aspect linéaire du stockage soit caché à l'utilisateur ( cf. l'opérateur []).
Cet opérateur pourrait plutôt renvoyer un pointeur sur le premier élément de la colonne (const double *).
Mais là, c'est une affaire de goût. ^_^
NairodDorian
Messages postés
130
Date d'inscription
lundi 26 juin 2006
Statut
Membre
Dernière intervention
18 août 2008
-
"Ton operator = ne permet pas le standard c++ qui autorise la forme :
mat1 mat2 mat3;"

Intérêt de faire mat1 mat2 mat3; ?

"Pour parler de l'"efficacité", il reste le C et aucune classe." Ce que j'ai voulu faire à la base mais je parle d'efficacité car les algos sont en O(n^3) pas en O(n!) comme la pluparts des sources.
yann_lo_san
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
17 -
...
yann_lo_san
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
17 -
Salut,

Ton operator = ne permet pas le standard c++ qui autorise la forme :
mat1 mat2 mat3;

Pour cela il te faut un constructeur par recopie conforme et un prototype de cette forme :
const Matrice& oparator = (const Matrice&);

De plus ton operator + en friend est inutile et pour la même raison il doit renvoyer une Matrice non constante par valeur :

Matrice operator + (const Matrice&);

De mon point de vue il est beaucoup plus lisible de declarer un pointeur vers un tableau à 2 dimentions :

double** m_pMat;

car les differents calculs seront plus lisibles avec le double operateur d'extraction
(m_pMat[0][1]) et le compilateur ne verra pas la difference (linéaire en mémoire...)

Pour parler de l'"efficacité", il reste le C et aucune classe. Beaucoup moins générique mais certainement plus efficace :

typedef float MAT4x4[4][4];

Les fonctions ou MACROs pour toutes les primitives, ex :

inline void copie_matrice(MAT4x4 source, MAT4x4 dest)
{
memcpy(dest, source, sizeof(MAT4x4));
}

Sinon je te mets 6 pour le partage.
NairodDorian
Messages postés
130
Date d'inscription
lundi 26 juin 2006
Statut
Membre
Dernière intervention
18 août 2008
-
On ne parle pas de division puisque une matrice n'est pas commutative.
On parle de multiplication à gauche ou à droite par un inverse.

Utilisé le bon vocabulaire est important :).