MATRICE : OPÉRATIONS ET AFFICHAGE

Signaler
Messages postés
48
Date d'inscription
lundi 4 août 2008
Statut
Membre
Dernière intervention
3 juin 2013
-
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
-
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/54746-matrice-operations-et-affichage

Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
355
@sazaju : je viens de livrer une nouvelle version :
1. J'ai modifié le constructeur comme tu me l'avais proposé
2. En fait, la factorisation était déjà faite avec les méthodes get et set mais je ne les avais pas employées. C'est chose faite maintenant
3. Idem 2
4. J'ai conservé la possibilité de changer le début du comptage mais cet attribut est devenu final. Ainsi, on ne pourra pas le modifier dynamiquement mais, il faudra le modifier dans le code. Ce qui imposera de comprendre le fonctionnement et on ne pourra pas commettre d'erreur. Même si ce n'est pas idéal, c'est un peu mieux.
5. Effectivement, je n'avais pas remarqué ça. C'est fait.
6. Fait en partie
7. Oui, ca marche aussi. Une étape de plus, mais plus simple à écrire donc j'ai modifié.
8. Fait également
9. Je ne comprend pas vraiment ce que tu veux faire avec ce pattern ?
10. Oui, je me suis relu :(

en tout cas merci
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
355
Merci pour ces conseils qui me semblent vraiment très intéressants. Je ferai une mise à jour dans la journée.
Messages postés
48
Date d'inscription
lundi 4 août 2008
Statut
Membre
Dernière intervention
3 juin 2013

Autres commentaires :

- pour éviter les accès concurrents inattendus, tu devrais éviter de récupérer le tableau donné en argument à ton constructeur tel quel, plutôt construire un nouveau tableau de ces même valeurs, comme ça un changement dans le tableau ne corromps pas la matrice. Par exemple si je veux créer plusieurs matrices similaires, je vais faire mon tableau, créer une matrice avec, changer quelques valeurs, créer une autre matrice, mais au final j'aurais deux fois la même matrice car la première et la seconde utilisent le même tableau.

- tu devrais factoriser ton calcul d'index "(i-DEBUT_COMPTAGE)*nColonnes+(j-DEBUT_COMPTAGE)" plutôt que de le copier coller partout, ça facilitera la maintenance en cas de modification (optimisation ou que sais-je).

- plutôt que de créer à chaque fois (multiplication, addition, ...) un tableau à la main pour ensuite créer la matrice résultat à la fin, je te suggère de créer la matrice résultat dès le début et d'utiliser les méthodes à ta disposition (res.set(i,j,v)) pour éviter de refaire à chaque fois tous tes calculs (notamment considérer le paramètre DEBUT_COMPTAGE) et simplifier à la fois la lecture du code et sa maintenance. Un constructeur qui crée une matrice vide avec pour argument seulement la taille des deux dimensions serait donc le bienvenu.

- l'idée d'avoir un comptage basé sur 0 ou 1 selon la config est sympa, mais vu que tu ne peux pas savoir si l'utilisateur utilise le bon système de comptage lors de la lecture/écriture des valeurs je pense que ça rajoute juste à la complexité et la difficulté de gestion d'erreurs. Dans ce sens, je pense que tu devrais choisir un seul système de comptage (le plus pertinent pour l'utilisateur, qui je pense est 1) et documenter tes fonctions en conséquences. En particulier, le fait que cette config soit sur une simple variable statique est dangereux : l'utilisation des deux méthodes (pour une raison ou une autre) est génératrice d'erreurs que tu es incapable de voir. Par exemple (1;1) basé sur 0 devient (2;2) basé sur 1, mais dans une matrice ayant suffisamment d'éléments, (1;1) et (2;2) étant deux coordonnées tout à fait légitimes dans les deux systèmes, tu ne verras jamais l'erreur.

- peut-être qu'un contrôle des coordonnées ne serait pas superflux, autrement l'erreur en cas de coordonnées hors limites te donne une erreur sur un tableau à une dimension, ce qui n'est pas cohérent avec la matrice (tu oblige à comprendre la structure interne de ta classe pour comprendre l'erreur). D'autant plus que je peux demander par exemple (3;-1) sans soucis. Si ça peut te paraître être de la flexibilité, ça devient un vrai problème en cas d'erreur de comptage (basé sur 1 ou sur 0) : le comptage basé sur 1 m'oblige à utiliser des coordonnées strictement positives, mais si l'utilisateur te donne (2;0), ton calcul donne un index valide dans le tableau interne alors que si ça se trouve l'utilisateur pense en base 0, et donc erreur impossible à voir.

- tu devrais donner les raisons dans tes exceptions, pas juste dire que quelque chose ne va pas (Le produit des deux matrices est impossible car ...).

- pour le calcul du déterminant, c'est pas plus simple de s'arrêter quand il ne reste plus qu'une matrice 1x1 ? Tu renvois le seul élément du tableau (si je me rappelle bien).

- pour tes variables d'endomorphisme : utilise des variables numérotées (e1, e2, ...) plutôt qu'un ensemble fini de lettres différentes.

- pour ta fonction normaliser(final double valeur), il me semble qu'un double peut-être écrit en notation scientifique (15.3e12), si c'est le cas ta fonction n'est pas exhaustive. Peut-être plus un pattern de ce genre "\\.0+([^0-9]|$)".

- relis-toi, y'a plein de fautes de frappes dans ta doc {'^_^}.
Messages postés
48
Date d'inscription
lundi 4 août 2008
Statut
Membre
Dernière intervention
3 juin 2013

Je parlais de mettre un constructeur qui prend une matrice "faite main" (tableau 2D), pas de se baser sur un tableau 2D pour la structure interne de ta matrice. Comme ça, si je récupère un tableau 2D à partir d'une fonction quelconque, je peux en faire directement une matrice en le donnant à ta classe, pas besoin de faire un pre-processing du tableau pour pouvoir en faire une matrice. Ce n'est qu'une facilité de plus, ça ne devrait strictement rien changé au reste de la classe.
Afficher les 6 commentaires