diff --git a/matrices_intro.md b/matrices_intro.md index 2083c4f7277fb4bc3646cc23830d8e0b6e51ed1c..44c4ca61171929b44ac5fec2713105ff69291628 100644 --- a/matrices_intro.md +++ b/matrices_intro.md @@ -34,110 +34,114 @@ Le contenu de la matrice devra être alloué dans une zone contiguë de la mémo Pour manipuler des matrices, vous devrez implémenter les fonctions suivantes -1. Fonctions pour la création de nouvelles matrices et leur destruction - - * création d'une nouvelle matrice de `m` lignes et `n` colonnes et allocation de la mémoire - - ```C - matrix matrix_create(int m, int n); - ``` - * libération de la mémoire de la matrice en argument, le pointeur vers les données est mis à `NULL`{.C}, le nombre de lignes et de colonnes sont mis à `-1` - - ```C - void matrix_destroy(matrix *mat); - ``` - * allocation d'une matrice, et initialisation de ses valeurs à partir d'un tableau de taille `m` et `n` - - ```C - matrix matrix_create_from_array(int m, int n, double data[]); - ``` - * création du clone de d'une matrice, la nouvelle matrice est une copie de la matrice d'origine - - ```C - matrix matrix_clone(matrix mat); - ``` - * affichage d'une matrice (très utile pour le débogage) - - ```C - void matrix_print(matrix mat); - ``` - * changement de la taille d'une matrice, si la nouvelle matrice est plus grande, les nouvelles cases sont initialisées à `0`, sinon les cases en trop disparaissent simplement (la fonction `realloc()`{.C} pourrait vous être utile) - - ```C - int matrix_resize(matrix *mat, int m, int n); - ``` - - * égalité parfaite ou approximative de deux matrices - - ```C - bool matrix_is_approx_equal(matrix mat1, matrix mat2, double epsilon); - bool matrix_is_equal(matrix mat1, matrix mat2); - ``` - -2. Fonctions pour les manipulations de matrices **en place** (on modifie les matrices passées en argument dans les fonctions). A vous de déterminer les signatures des fonctions - - * addition de deux matrices, la première matrice est modifiée - - ```C - ... matrix_add_in_place(...); - ``` - * soustraction de deux matrices, la première matrice est modifiée - - ```C - ... matrix_sub_in_place(...); - ``` - * multiplication de deux matrices, la première matrice est modifiée - - ```C - ... matrix_mult_in_place(...); - ``` - * addition d'une matrice avec un scalaire, la matrice est modifiée - - ```C - ... matrix_add_scalar_in_place(...); - ``` - * multiplication d'une matrice avec un scalaire, la matrice est modifiée - - ```C - ... matrix_mult_scalar_in_place(...); - ``` - * calcul de la transposée d'une matrice, la matrice est modifiée - - ```C - ... matrix_transpose_in_place(...); - ``` -3. Fonctions pour les manipulations de matrices, nécessitant une nouvelle allocation (il faut réutiliser les fonctions définies en 1 et 2) - - * addition de deux matrices, et stockage du résultat dans une troisième matrice - - ```C - ... matrix_add(...); - ``` - * soustraction de deux matrices, et stockage du résultat dans une troisième matrice - - ```C - ... matrix_sub(...); - ``` - * multiplication de deux matrices, et stockage du résultat dans une troisième matrice - - ```C - ... matrix_mult(...); - ``` - * addition d'un scalaire avec une matrice, et stockage du résultat dans une troisième matrice - - ```C - ... matrix_add_scalar(...); - ``` - * multiplication d'un scalaire avec une matrice, et stockage du résultat dans une autre matrice - - ```C - ... matrix_mult_scalar(...); - ``` - * calcul de la transposée d'une matrice, et stocke le résultat dans une nouvelle matrice - - ```C - ... matrix_transpose(...); - ``` +### Fonctions pour la création de nouvelles matrices et leur destruction + +* création d'une nouvelle matrice de `m` lignes et `n` colonnes et allocation de la mémoire + + ```C + matrix matrix_create(int m, int n); + ``` +* libération de la mémoire de la matrice en argument, le pointeur vers les données est mis à `NULL`{.C}, le nombre de lignes et de colonnes sont mis à `-1` + + ```C + void matrix_destroy(matrix *mat); + ``` +* allocation d'une matrice, et initialisation de ses valeurs à partir d'un tableau de taille `m` et `n` + + ```C + matrix matrix_create_from_array(int m, int n, double data[]); + ``` +* création du clone de d'une matrice, la nouvelle matrice est une copie de la matrice d'origine + + ```C + matrix matrix_clone(matrix mat); + ``` +* affichage d'une matrice (très utile pour le débogage) + + ```C + void matrix_print(matrix mat); + ``` +* changement de la taille d'une matrice, si la nouvelle matrice est plus grande, les nouvelles cases sont initialisées à `0`, sinon les cases en trop disparaissent simplement (la fonction `realloc()`{.C} pourrait vous être utile) + + ```C + int matrix_resize(matrix *mat, int m, int n); + ``` + +* égalité parfaite ou approximative de deux matrices + + ```C + bool matrix_is_approx_equal(matrix mat1, matrix mat2, double epsilon); + bool matrix_is_equal(matrix mat1, matrix mat2); + ``` + +### Fonctions pour les manipulations de matrices **en place** + +Les fonctions modifient les matrices passées en argument. A vous de déterminer les signatures des fonctions + +* addition de deux matrices, la première matrice est modifiée + + ```C + ... matrix_add_in_place(...); + ``` +* soustraction de deux matrices, la première matrice est modifiée + + ```C + ... matrix_sub_in_place(...); + ``` +* multiplication de deux matrices, la première matrice est modifiée + + ```C + ... matrix_mult_in_place(...); + ``` +* addition d'une matrice avec un scalaire, la matrice est modifiée + + ```C + ... matrix_add_scalar_in_place(...); + ``` +* multiplication d'une matrice avec un scalaire, la matrice est modifiée + + ```C + ... matrix_mult_scalar_in_place(...); + ``` +* calcul de la transposée d'une matrice, la matrice est modifiée + + ```C + ... matrix_transpose_in_place(...); + ``` +### Fonctions pour les manipulations de matrices + +Ces opérations nécessitent une nouvelle allocation (il faut réutiliser les fonctions définies en 1 et 2). + +* addition de deux matrices, et stockage du résultat dans une troisième matrice + + ```C + ... matrix_add(...); + ``` +* soustraction de deux matrices, et stockage du résultat dans une troisième matrice + + ```C + ... matrix_sub(...); + ``` +* multiplication de deux matrices, et stockage du résultat dans une troisième matrice + + ```C + ... matrix_mult(...); + ``` +* addition d'un scalaire avec une matrice, et stockage du résultat dans une troisième matrice + + ```C + ... matrix_add_scalar(...); + ``` +* multiplication d'un scalaire avec une matrice, et stockage du résultat dans une autre matrice + + ```C + ... matrix_mult_scalar(...); + ``` +* calcul de la transposée d'une matrice, et stocke le résultat dans une nouvelle matrice + + ```C + ... matrix_transpose(...); + ``` <!-- 2. Fonctions pour les manipulations de matrices **en place** (on modifie les matrices passées en argument dans les fonctions) @@ -227,13 +231,15 @@ vérifier automatiquement si les résultats que vous obtenez sont corrects. ## Indications -Ce travail pratique est compliqué, car il requiert l'utilisation de pointeurs et il y a de grands risques -de fuites mémoires. Pensez à utiliser les warnings et les sanitizers, cela peut vous sauver d'erreurs +* Pensez à compiler souvent: le compilateur est votre ami. +* Évitez d'écrire toutes les fonctions en un fois sans tester si les fonctionnalités marchent comme vous le souhaitez. +* Pensez à utiliser les warnings et les sanitizers, cela peut vous sauver d'erreurs terribles et très difficiles à découvrir -```bash --Wall -Wextra -pedantic -fsanitize=address -``` + ```C + -Wall -Wextra -pedantic -fsanitize=address + ``` +* Lorsque vous voyez apparaître des warnings corrigez-les immédiatement et pas "quand vous aurez fini". Il arrive régulièrement qu'un warning vous indique une erreur de logique dans votre code. ## Rapide introduction/rappel aux matrices