Final exercice: Matrix class


To translate this course in your native langage:

  • In Chrome: right-click anywhere on the page and select “Translate to…”

  • Or use this language selector:

Les mots colorés en anglais représentent des mots-clés de la norme du langage C++. Ils sont conservés à l’identique lors de l’utilisation d’une traduction automatique avec Google Translate. Exemple : l’héritage (inheritance) est un principe fondamental de C++.


L’objectif de cet exercice final est de développer une classe template pour gérer les matrices carrées square matrix. Sa réalisation demande une bonne maîtrise des notions abordées dans les chapitres de cours précédents.

Avertissement

IA or not IA, that is the question. Cet exercice est au programme de l’examen.

Convention

../_images/conv.png

Notations :

  • Une matrice \(M_{mn}\) contient m lignes et n colonnes.

  • L’élément \(m_{ij}\) se trouve sur la ligne i colonne j.

  • La notion \(m_{ij}\) peut être contre-intuitive car en géométrie 2D, elle correspond à \(m_{yx}\) et non \(m_{xy}\)

Partie I

Vous allez créer une classe générique SMatrix pour représenter les matrices carrées.

  • Créez un fichier nommé SMatrix_base.cpp

  • La classe SMatrix doit être une classe template admettant comme paramètres :

    • Le type des données int, float, double…

    • La largeur de la matrice

  • Pour stocker les valeurs, vous devez utiliser un ou plusieurs containers de la STL.

    • Les tableaux du C sont interdits

    • Plusieurs options sont possibles

    • Le containeur retenu doit être paramétré en utilisant les paramètres du template de la classe SMatrix

    • Ce container sera déclaré private

  • Fournissez l’accès à chaque élément par la syntaxe : M[i][j] avec M un objet SMatrix :

    • En C++, peut-on créer directement un opérateur [][] ?

    • Cette syntaxe impose de choisir une modélisation adaptée :

      • Il faut choisir une modélisation pour la classe SMatrix qui permette de la faire fonctionner.

      • Plusieurs options sont possibles et affectent directement le choix du container de données.

  • Pour cette classe, fournissez les fonctionnalités suivantes :

    • Constructeur par défaut : ne réalise aucune initialisation des éléments.

    • Constructeur prenant une valeur : initialise tous les éléments avec la valeur passée en paramètre.

    • Constructeur par recopie : reçoit un objet SMatrix et recopie l’ensemble de ses valeurs.

    • size() : retourne la largeur de la matrice.

    • get(i,j) : retourne la valeur située à la position (i,j) - on ne gère pas les indices hors plage

    • set(i,j, value) : modifie la valeur située à la position (i,j) - on ne gère pas les indices hors plage

    • print() : affiche le contenu de la matrice sous la forme d’un tableau 2D

    • bool equals(const SMatrix & other) : indique si l’objet courant contient les mêmes valeurs que l’objet passé en paramètre.

    • SMatrix& operator=(SMatrix other) : copie le contenu d’un objet SMatrix dans l’objet courant.

  • Fournissez un constructeur permettant d’initialiser les valeurs de la matrice à partir d’une liste de valeurs :

    • Exemple : SMatrix<int, 2> m({1, 2, 3, 4})

    • Syntaxe permettant d’accepter une telle liste entre accolades : SMatrix(std::initializer_list<T> values)

    • Les valeurs doivent être placées ligne par ligne dans la matrice.

    • On supposera que le nombre de valeurs fournies correspond exactement au nombre d’éléments de la matrice.

  • L’utilisation du mot-clef const doit être faite chaque fois que nécessaire.

  • Pour vérifier votre code, vous devez utiliser les tests suivants : test1.txt

  • Déposez votre fichier contenant la classe et les tests dans l’espace partagé

Partie II

Opérateurs

  • Créez un fichier nommé SMatrix_operators.cpp

  • Mettez en place les opérateurs externes suivants :

    • Addition et soustraction de deux matrices carrées

    • Multiplication entre deux matrices carrées

    • Multiplication d’une matrice par un nombre entier par la gauche et par la droite

    • Un opérateur externe est un opérateur déclaré comme une fonction et non comme une fonction membre

  • Créez une fonction t(…) qui retourne la transposée de la matrice passée en argument

friend keyword

Comme nous créons des opérateurs externes (non membre de la classe), ils ne peuvent pas accéder aux données privées et doivent donc utiliser les accesseurs publics. Cependant, il est possible d’accéder aux données privées d’une classe depuis une fonction externe. Pour cela, il faut écrire la déclaration de cette fonction à l’intéreur de la classe et lui ajouter le qualificatif friend comme ceci :

template ...
class SMatrix
{
    ...

        template ... friend ... operator+(...,...);
};

Test final

Vous devez pouvoir effectuer le calcul suivant en utilisant vos opérateurs :

\[A = A \cdot A^t + 2 \cdot A - A \cdot A\]

Test

Vous devez pouvoir compiler et exécuter la ligne suivante :

A = A * t(A) + 2 * A - A * A;

Utilisez la matrice A= [ [1,2,3], [2,3,4], [3,4,5]] pour tester votre résultat. Vous devez obtenir :

>>  2  4  6
>>  4  6  8
>>  6  8 10

Travail sur l’espace partagé

  • Le test demandé doit être présent dans le code

  • Uploadez le fichier SMatrix_operators.cpp sur votre espace partagé