Bonjour,
je souhaite créer un noyau d'algèbre linéaire permettant de traiter différents types de matrices (pleines, creuses, structurées).
J'ai d'abord créé 3 classes (génériques) pour la gestion de tableaux :
1. Array (classe abstraite)
2. Array1D (hérite de Array)
3. Array2D (hérite de Array)
Un objet Array1D est un tableau unidimensionnel et un objet Array2D est un tableau bidimensionnel.
J'ai ensuite créé une classe abstraite Matrix ayant pour attribut un pointeur sur Array (Array* _nzval). Le champ _nzval est destiné à contenir les valeurs non nulles de la matrice.
De cette classe vont dériver toutes les autres classes de matrices :
1. FullMatrix (matrice pleine)
2. DiagonalMatrix (matrice diagonale)
3. etc
Dans le cas classique d'une matrice pleine, je vais construire _nzval en appelant un constructeur de Array2D :
_nzval = new Array2D(...);
Mais il peut arriver que _nzval soit un tableau unidimensionnel. Par exemple, pour une matrice diagonale, je ferais l'allocation
_nzval = new Array1D(...);
Ma question est la suivante. Comment faire pour appeler les méthodes de Array1D ou Array2D (selon les cas) alors que le compilateur voit _nzval comme un simple Array*? Faut-il absolument faire un transtypage explicite? Si oui, cela a-t-il des conséquences sur les performances?
Si vous pensez que mon problème vient d'une mauvaise structuration de mes données n'hésitez pas à me le dire.
Merci d'avance pour votre aide.
Partager