Multiplier Deux Matrices en C

CBeginner
Pratiquer maintenant

Introduction

Dans ce laboratoire, vous apprendrez à multiplier deux matrices en C. Le laboratoire couvre les étapes suivantes :

Lecture des dimensions et des éléments : Vous apprendrez à lire les dimensions et les éléments de deux matrices à partir de l'entrée utilisateur. Cette étape garantit que les matrices sont compatibles pour la multiplication.

Multiplication des lignes par les colonnes : Vous implémenterez l'algorithme de multiplication de matrices, où chaque élément de la matrice produit est calculé en multipliant les lignes et les colonnes correspondantes des matrices d'entrée.

Affichage de la matrice produit : Enfin, vous afficherez la matrice produit résultante.

À la fin de ce laboratoire, vous aurez une bonne compréhension de la multiplication de matrices en C et serez capable de l'appliquer à diverses applications.

Lecture des dimensions et des éléments

Dans cette étape, vous apprendrez à lire les dimensions et les éléments des matrices pour la multiplication de matrices en C. Nous allons créer un programme permettant aux utilisateurs d'entrer la taille et les valeurs de deux matrices.

Tout d'abord, créons un nouveau fichier C pour notre programme de multiplication de matrices :

cd ~/project
nano matrix_multiply.c

Maintenant, ajoutez le code suivant pour lire les dimensions des matrices :

#include <stdio.h>

#define MAX_SIZE 100

int main() {
    int rows1, cols1, rows2, cols2;

    // Lecture des dimensions de la première matrice
    printf("Entrez les dimensions de la première matrice (lignes colonnes) : ");
    scanf("%d %d", &rows1, &cols1);

    // Lecture des dimensions de la deuxième matrice
    printf("Entrez les dimensions de la deuxième matrice (lignes colonnes) : ");
    scanf("%d %d", &rows2, &cols2);

    // Vérification de la compatibilité des matrices pour la multiplication
    if (cols1 != rows2) {
        printf("Multiplication de matrices impossible !\n");
        return 1;
    }

    printf("Les dimensions des matrices sont valides pour la multiplication.\n");

    return 0;
}

Compilation et exécution du programme :

gcc matrix_multiply.c -o matrix_multiply
./matrix_multiply

Exemple de sortie :

Entrez les dimensions de la première matrice (lignes colonnes) : 2 3
Entrez les dimensions de la deuxième matrice (lignes colonnes) : 3 2
Les dimensions des matrices sont valides pour la multiplication.

Décomposons le code :

  • Nous définissons MAX_SIZE à 100 pour limiter les dimensions des matrices.
  • scanf() est utilisé pour lire les dimensions des matrices à partir de l'entrée utilisateur.
  • Nous vérifions si la multiplication de matrices est possible en comparant les colonnes de la première matrice aux lignes de la deuxième matrice.
  • Si les dimensions ne sont pas compatibles, le programme affiche un message d'erreur.

Modifions maintenant le code pour lire les éléments des matrices :

#include <stdio.h>

#define MAX_SIZE 100

int main() {
    int rows1, cols1, rows2, cols2;
    int matrix1[MAX_SIZE][MAX_SIZE];
    int matrix2[MAX_SIZE][MAX_SIZE];

    // Lecture des dimensions de la première matrice
    printf("Entrez les dimensions de la première matrice (lignes colonnes) : ");
    scanf("%d %d", &rows1, &cols1);

    // Lecture des dimensions de la deuxième matrice
    printf("Entrez les dimensions de la deuxième matrice (lignes colonnes) : ");
    scanf("%d %d", &rows2, &cols2);

    // Vérification de la compatibilité des matrices pour la multiplication
    if (cols1 != rows2) {
        printf("Multiplication de matrices impossible !\n");
        return 1;
    }

    // Lecture des éléments de la première matrice
    printf("Entrez les éléments de la première matrice :\n");
    for (int i = 0; i < rows1; i++) {
        for (int j = 0; j < cols1; j++) {
            printf("Entrez l'élément [%d][%d] : ", i, j);
            scanf("%d", &matrix1[i][j]);
        }
    }

    // Lecture des éléments de la deuxième matrice
    printf("Entrez les éléments de la deuxième matrice :\n");
    for (int i = 0; i < rows2; i++) {
        for (int j = 0; j < cols2; j++) {
            printf("Entrez l'élément [%d][%d] : ", i, j);
            scanf("%d", &matrix2[i][j]);
        }
    }

    printf("Les matrices ont été lues avec succès.\n");

    return 0;
}

Compilation et exécution du programme :

gcc matrix_multiply.c -o matrix_multiply
./matrix_multiply

Exemple de sortie :

Entrez les dimensions de la première matrice (lignes colonnes) : 2 3
Entrez les dimensions de la deuxième matrice (lignes colonnes) : 3 2
Entrez les éléments de la première matrice :
Entrez l'élément [0][0] : 1
Entrez l'élément [0][1] : 2
...
Les matrices ont été lues avec succès.

Multiplication des lignes par les colonnes

Dans cette étape, vous apprendrez à effectuer la multiplication de matrices en multipliant les lignes de la première matrice par les colonnes de la deuxième matrice. Nous allons construire sur le code précédent pour implémenter l'algorithme de multiplication de matrices.

Mettez à jour le fichier matrix_multiply.c pour ajouter la fonctionnalité de multiplication de matrices :

cd ~/project
nano matrix_multiply.c

Remplacez le code précédent par l'implémentation suivante :

#include <stdio.h>

#define MAX_SIZE 100

int main() {
    int rows1, cols1, rows2, cols2;
    int matrix1[MAX_SIZE][MAX_SIZE];
    int matrix2[MAX_SIZE][MAX_SIZE];
    int result[MAX_SIZE][MAX_SIZE];

    // Lecture des dimensions de la première matrice
    printf("Entrez les dimensions de la première matrice (lignes colonnes) : ");
    scanf("%d %d", &rows1, &cols1);

    // Lecture des dimensions de la deuxième matrice
    printf("Entrez les dimensions de la deuxième matrice (lignes colonnes) : ");
    scanf("%d %d", &rows2, &cols2);

    // Vérification de la compatibilité des matrices pour la multiplication
    if (cols1 != rows2) {
        printf("Multiplication de matrices impossible !\n");
        return 1;
    }

    // Lecture des éléments de la première matrice
    printf("Entrez les éléments de la première matrice :\n");
    for (int i = 0; i < rows1; i++) {
        for (int j = 0; j < cols1; j++) {
            printf("Entrez l'élément [%d][%d] : ", i, j);
            scanf("%d", &matrix1[i][j]);
        }
    }

    // Lecture des éléments de la deuxième matrice
    printf("Entrez les éléments de la deuxième matrice :\n");
    for (int i = 0; i < rows2; i++) {
        for (int j = 0; j < cols2; j++) {
            printf("Entrez l'élément [%d][%d] : ", i, j);
            scanf("%d", &matrix2[i][j]);
        }
    }

    // Multiplication des matrices
    for (int i = 0; i < rows1; i++) {
        for (int j = 0; j < cols2; j++) {
            result[i][j] = 0;
            for (int k = 0; k < cols1; k++) {
                result[i][j] += matrix1[i][k] * matrix2[k][j];
            }
        }
    }

    // Affichage de la matrice résultat
    printf("\nMatrice résultat :\n");
    for (int i = 0; i < rows1; i++) {
        for (int j = 0; j < cols2; j++) {
            printf("%d ", result[i][j]);
        }
        printf("\n");
    }

    return 0;
}

Compilation et exécution du programme :

gcc matrix_multiply.c -o matrix_multiply
./matrix_multiply

Exemple de sortie :

... (sortie identique)

Décomposons l'algorithme de multiplication de matrices :

  • Les deux boucles externes i et j itèrent sur la matrice résultat.
  • La boucle interne k effectue le produit scalaire de la ligne i de la première matrice et de la colonne j de la deuxième matrice.
  • result[i][j] est calculé en additionnant les produits des éléments correspondants.
  • Les boucles imbriquées garantissent que chaque élément de la matrice résultat est calculé correctement.

Points clés concernant la multiplication de matrices :

  • Le nombre de colonnes de la première matrice doit être égal au nombre de lignes de la deuxième matrice.
  • La matrice résultante aura des dimensions (lignes de la première matrice) × (colonnes de la deuxième matrice).

Affichage de la matrice produit

Dans cette dernière étape, nous allons améliorer notre programme de multiplication de matrices en ajoutant une fonctionnalité d'impression plus robuste et une gestion des erreurs. Nous allons créer des fonctions pour afficher les matrices et améliorer l'expérience utilisateur globale.

Mettez à jour le fichier matrix_multiply.c avec l'implémentation améliorée suivante :

cd ~/project
nano matrix_multiply.c

Remplacez le code précédent par cette version complète :

#include <stdio.h>

#define MAX_SIZE 100

// Fonction pour afficher une matrice
void printMatrix(int matrix[MAX_SIZE][MAX_SIZE], int rows, int cols, const char* matrixName) {
    printf("\n%s Matrix:\n", matrixName);
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%5d ", matrix[i][j]);
        }
        printf("\n");
    }
}

int main() {
    int rows1, cols1, rows2, cols2;
    int matrix1[MAX_SIZE][MAX_SIZE];
    int matrix2[MAX_SIZE][MAX_SIZE];
    int result[MAX_SIZE][MAX_SIZE];

    // Lecture des dimensions de la première matrice
    printf("Entrez les dimensions de la première matrice (lignes colonnes) : ");
    scanf("%d %d", &rows1, &cols1);

    // Lecture des dimensions de la deuxième matrice
    printf("Entrez les dimensions de la deuxième matrice (lignes colonnes) : ");
    scanf("%d %d", &rows2, &cols2);

    // Vérification de la compatibilité des matrices pour la multiplication
    if (cols1 != rows2) {
        printf("Multiplication de matrices impossible !\n");
        printf("Le nombre de colonnes de la première matrice (%d) doit être égal au nombre de lignes de la deuxième matrice (%d).\n", cols1, rows2);
        return 1;
    }

    // Lecture des éléments de la première matrice
    printf("Entrez les éléments de la première matrice :\n");
    // ... (code identique)
}

Compilation et exécution du programme :

gcc matrix_multiply.c -o matrix_multiply
./matrix_multiply

Exemple de sortie :

... (sortie identique)

Améliorations clés de cette version :

  • Fonction printMatrix() créée pour afficher les matrices avec une mise en forme cohérente.
  • Messages d'erreur plus descriptifs pour la compatibilité de la multiplication de matrices.
  • Affichage des matrices d'entrée avant l'affichage de la matrice produit.
  • Utilisation de %5d pour un affichage aligné des matrices.
  • Format de sortie clair et lisible.

Explication de la fonction d'affichage :

  • printMatrix() prend la matrice, ses dimensions et un nom en paramètres.
  • Utilise des boucles imbriquées pour afficher chaque élément.
  • Le spécificateur de format %5d garantit que chaque nombre prend 5 espaces pour l'alignement.
  • Ajoute une nouvelle ligne après chaque ligne pour une meilleure lisibilité.

Résumé

Dans ce laboratoire, vous apprendrez à lire les dimensions et les éléments d'une matrice, puis à effectuer la multiplication de matrices en C. Premièrement, vous apprendrez à lire les dimensions de deux matrices et à vérifier si elles sont compatibles pour la multiplication. Ensuite, vous apprendrez à lire les éléments des deux matrices et à les stocker dans des tableaux bidimensionnels. Enfin, vous apprendrez à effectuer la multiplication matricielle proprement dite et à afficher la matrice produit résultante.