-
orestis.malaspin authoredorestis.malaspin authored
author:
- Tableaux unidimensionnels
title: Cours de programmation séquentielle
autoSectionLabels: false
autoEqnLabels: true
eqnPrefix:
- "éq."
- "éqs."
chapters: true
numberSections: false
chaptersDepth: 1
sectionsDepth: 3
lang: fr
documentclass: article
papersize: A4
cref: false
urlcolor: blue
toc: false
Les matrices
Buts
Utilisation de pointeurs sur des pointeurs en C
.
Énoncé
Écrire des fichiers matrix.h
et matrix.c
pour manipuler des matrices de nombres à virgule flottantes.
Le contenu de la matrice devra être alloué dans une zone contiguë de la mémoire, tout en restant accessible par l'opérateur []
.
Cahier des charges
Pour manipuler des matrices, vous devrez implémenter les fonctions suivantes
-
création d'une nouvelle matrice de
row
lignes etcol
colonnesm_double* matrix_alloc(unsigned int row, unsigned int col);
-
calcul de la transposée de la matrice en paramètre
m_double* matrix_transpose(m_double* m);
-
addition des 2 matrices en paramètre (retourne
NULL
{.language-c} si l'opération est impossible)m_double* matrix_add(m_double* m1, m_double* m2);
-
multiplication des 2 matrices en paramètre (retourne
NULL
{.language-c} si l'opération est impossible)m_double* matrix_mult(m_double* m1, m_double* m2);
-
libération de la matrice en paramètre
void matrix_free(m_double* m);
Le type matrice sera défini en C
de la manière suivante
typedef struct m_double {
unsigned int row, col;
double** content;
} m_double;
Voici une illustration d'une matrice avec row=5
et col=4
.
Il faut d'abord allouer la zone mémoire des éléments et le tableau de pointeurs content,
puis faire pointer chaque pointeur de content au bon endroit dans la zone mémoire des éléments
(c'est-à-dire sur chaque élément de début de ligne, voir @fig:matrix).
Écrire un programme de test matrix_compute.c
utilisant vos fichiers de manipulation de matrices.
Les matrices avec lesquelles on effectuera les opérations doivent être stockées dans des fichiers
structurés en un format spécifique (voir plus bas). Le programme lit donc les matrices depuis des
fichiers et écrit le résultat de l'opération à l'écran dans le même format.
Format d’un fichier matrices
-
La première ligne du fichier indique la dimension de la matrice. Le format est
<nombre de ligne> <un espace> <nombre de colonne>
-
Les lignes suivantes définissent les lignes de la matrice. Le format est
<valeur1> <un espace> <valeur2> <un espace> … <valeurN>
-
Aucune valeur ne doit contenir de zéros terminaux (sauf la valeur
0
); par exemple la valeur1.0
doit être écrite 1, la valeur7.450
doit être écrite7.45
, la valeur0.000
doit être écrite0
, etc. (cf. plus bas pour voir comment réaliser ceci enC
).
A titre d’exemple, soit la matrice A ci-dessous
\begin{equation} \underline{\underline{A}} = \begin{pmatrix} 2.2 & 1.3 & -1.2 & -2.2 \ 3.0 & 1.2 & 1.3 & 3.3 \ 1.0 & 4.0 & -1.3 & -1.0 \ \end{pmatrix}. \end{equation}
sera représentée par le contenu du fichier suivant
3 4
2.2 1.3 -1.2 -2.2
3 1.2 1.3 3.3
1 4 -1.3 -1
La fonction printf
du langage C
permet d’afficher des nombres de type double dans le format correct avec le formatteur %g
.
Par exemple, pour afficher le double x=9.230
dans le bon format (sans zéros terminaux), on écrira
printf("%g", x);
Voici maintenant un exemple plus complet d’addition de matrices
\begin{equation}
\underline{\underline{A}} =
\begin{pmatrix}
2.2 & 1.3 & -1.2 & -2.2 \
3.0 & 1.2 & 1.3 & 3.3 \
1.0 & 4.0 & -1.3 & -1.0 \
\end{pmatrix}
\mbox{ et }
\underline{\underline{B}} =
\begin{pmatrix}
1.2 & 2.3 & 3.2 & -1.2 \
2.0 & 0.2 & 2.3 & 3.0 \
1.0 & 3.2 & 1.3 & -1.0 \
\end{pmatrix}.
\end{equation}
donne comme résultat
\begin{equation}
\underline{\underline{A}}+\underline{\underline{B}} =
\begin{pmatrix}
3.4 & 3.6 & 2.0 & -3.4 \
5.0 & 1.4 & 3.6 & 6.3 \
2.0 & 7.2 & 0.0 & -2.0 \
\end{pmatrix}.
\end{equation}
Les éléments des matrices A
et B
doivent être stockés selon le format décrit auparavant dans des fichiers nommés par exemple matA.dat
et matB.dat
.
Voici le contenu du fichier matA.dat
correspondant à la matrice A
ci-dessus
3 4
2.2 1.3 -1.2 -2.2
3 1.2 1.3 3.3
1 4 -1.3 -1
Le calcul doit pouvoir être lancé avec la commande
./matrix_compute add matA.dat matB.dat
et le résultat s'affiche à l'écran suivant le même format que décrit auparavant
3 4
3.4 3.6 2 -3.4
5 1.4 3.6 6.3
2 7.2 0 -2
Si le calcul est impossible, rien n'est affiché. De même, on effectuera respectivement multiplication et transposition avec les commandes
./matrix_compute mult matA.dat matB.dat
./matrix_compute transpose matA.dat