Langage C/C++

Multiplication de Deux Matrices en Langage C Utilisant des Pointeurs

Dans cet article, nous allons explorer comment multiplier deux matrices en utilisant des pointeurs en langage C.

💡 La multiplication de matrices est une opération fondamentale en algèbre linéaire et est souvent utilisée dans de nombreuses applications informatiques, notamment dans le traitement d’images, les simulations scientifiques, et la programmation graphique. En langage C, l’utilisation de pointeurs est courante pour manipuler les tableaux, y compris les matrices.

Structure de Données pour les Matrices

Avant de procéder à la multiplication, il est important de comprendre comment représenter les matrices en langage C. Nous utiliserons des pointeurs pour créer et manipuler les matrices. Une matrice peut être considérée comme un tableau bidimensionnel dans lequel chaque élément est stocké dans une zone de mémoire contiguë.

Voici comment nous pouvons déclarer une matrice en utilisant des pointeurs en langage C :

#define ROWS 3
#define COLS 3

// Déclaration d'une matrice de dimensions ROWS x COLS
int matrix[ROWS][COLS];
Algorithme de Multiplication de Deux Matrices

Pour multiplier deux matrices ( A ) et ( B ) de dimensions mxn et nxp respectivement, le produit C= AxB est une nouvelle matrice de dimensions mxp. Chaque élément de la matrice produit ( C ) est calculé en prenant le produit scalaire des lignes de la première matrice et des colonnes de la deuxième matrice.

L’algorithme de multiplication de matrices peut être implémenté en langage C comme suit :

void multiplyMatrices(int *A, int *B, int *C, int m, int n, int p) {
    for (int i = 0; i < m; ++i) {
        for (int j = 0; j < p; ++j) {
            *(C + i * p + j) = 0;
            for (int k = 0; k < n; ++k) {
                *(C + i * p + j) += *(A + i * n + k) * *(B + k * p + j);
            }
        }
    }
}

Dans cette fonction multiplyMatrices, les paramètres sont les suivants :

  • A, B, et C sont les pointeurs vers les matrices ( A ), ( B ), et ( C ) respectivement.
  • m, n, et p représentent les dimensions des matrices ( A ), ( B ), et ( C ) respectivement.
Exemple d’Utilisation

Voici un exemple d’utilisation de la fonction multiplyMatrices pour multiplier deux matrices en langage C :

#include <stdio.h>

#define ROWS 3
#define COLS 3

int main() {
    int A[ROWS][COLS] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    int B[ROWS][COLS] = {{9, 8, 7}, {6, 5, 4}, {3, 2, 1}};
    int C[ROWS][COLS];

    multiplyMatrices(&A[0][0], &B[0][0], &C[0][0], ROWS, COLS, ROWS);

    printf("Matrice C (A x B):\n");
    for (int i = 0; i < ROWS; ++i) {
        for (int j = 0; j < COLS; ++j) {
            printf("%d ", C[i][j]);
        }
        printf("\n");
    }

    return 0;
}

Ce programme affichera la matrice produit ( C ) résultante de la multiplication de ( A ) et ( B ).

Voici quelques ⭐ exemples d’applications ⭐ courantes où la multiplication de matrices est utilisée, accompagnés de code en langage C :

1. Traitement d’Images – Application de Filtres

Dans le traitement d’images, les filtres peuvent être appliqués à une image en utilisant la convolution, qui implique la multiplication de matrices. Voici un exemple simple de l’application d’un filtre de flou gaussien à une image en utilisant la multiplication de matrices :

#include <stdio.h>

#define IMAGE_WIDTH 3
#define IMAGE_HEIGHT 3

void applyFilter(float image[IMAGE_HEIGHT][IMAGE_WIDTH], float filter[3][3], float result[IMAGE_HEIGHT][IMAGE_WIDTH]) {
    for (int i = 0; i < IMAGE_HEIGHT; ++i) {
        for (int j = 0; j < IMAGE_WIDTH; ++j) {
            result[i][j] = 0;
            for (int k = 0; k < 3; ++k) {
                for (int l = 0; l < 3; ++l) {
                    int x = i - 1 + k;
                    int y = j - 1 + l;
                    if (x >= 0 && x < IMAGE_HEIGHT && y >= 0 && y < IMAGE_WIDTH) {
                        result[i][j] += image[x][y] * filter[k][l];
                    }
                }
            }
        }
    }
}

int main() {
    float image[IMAGE_HEIGHT][IMAGE_WIDTH] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    float filter[3][3] = {{1, 2, 1}, {2, 4, 2}, {1, 2, 1}};
    float result[IMAGE_HEIGHT][IMAGE_WIDTH];

    applyFilter(image, filter, result);

    printf("Image après l'application du filtre de flou gaussien :\n");
    for (int i = 0; i < IMAGE_HEIGHT; ++i) {
        for (int j = 0; j < IMAGE_WIDTH; ++j) {
            printf("%.2f ", result[i][j]);
        }
        printf("\n");
    }

    return 0;
}
2. Simulation Physique – Mécanique des Fluides

Dans la simulation de la mécanique des fluides, la méthode des différences finies peut être utilisée pour résoudre les équations gouvernant le mouvement des fluides. La multiplication de matrices est couramment utilisée pour discrétiser ces équations. Voici un exemple simple d’application de la méthode des différences finies pour résoudre l’équation de la chaleur en 2D :

#include <stdio.h>

#define GRID_SIZE 5
#define TIME_STEPS 10

void solveHeatEquation(float grid[GRID_SIZE][GRID_SIZE], float result[GRID_SIZE][GRID_SIZE]) {
    float dt = 0.1; // Pas de temps
    float dx = 0.1; // Pas d'espace
    float alpha = 0.1; // Coefficient de diffusion thermique

    for (int t = 0; t < TIME_STEPS; ++t) {
        for (int i = 1; i < GRID_SIZE - 1; ++i) {
            for (int j = 1; j < GRID_SIZE - 1; ++j) {
                result[i][j] = grid[i][j] + alpha * dt / (dx * dx) * (grid[i+1][j] + grid[i-1][j] + grid[i][j+1] + grid[i][j-1] - 4 * grid[i][j]);
            }
        }
        // Mettre à jour la grille pour la prochaine itération
        for (int i = 1; i < GRID_SIZE - 1; ++i) {
            for (int j = 1; j < GRID_SIZE - 1; ++j) {
                grid[i][j] = result[i][j];
            }
        }
    }
}

int main() {
    float initialGrid[GRID_SIZE][GRID_SIZE] = {{0}};
    float result[GRID_SIZE][GRID_SIZE];

    // Initialiser la grille avec des conditions initiales

    solveHeatEquation(initialGrid, result);

    printf("Grille après résolution de l'équation de la chaleur :\n");
    for (int i = 0; i < GRID_SIZE; ++i) {
        for (int j = 0; j < GRID_SIZE; ++j) {
            printf("%.2f ", result[i][j]);
        }
        printf("\n");
    }

    return 0;
}

Ces exemples illustrent comment la multiplication de matrices est utilisée dans des applications réelles en langage C.

Voici quelques ⭐ cas particuliers ⭐ de multiplication de matrices avec du code en langage C :

1. Multiplication de Matrices Carrées

Dans ce cas, les deux matrices sont carrées, c’est-à-dire qu’elles ont le même nombre de lignes et de colonnes. Voici un exemple de multiplication de matrices carrées en langage C :

#include <stdio.h>

#define SIZE 3

void multiplySquareMatrices(int A[SIZE][SIZE], int B[SIZE][SIZE], int C[SIZE][SIZE]) {
    for (int i = 0; i < SIZE; ++i) {
        for (int j = 0; j < SIZE; ++j) {
            C[i][j] = 0;
            for (int k = 0; k < SIZE; ++k) {
                C[i][j] += A[i][k] * B[k][j];
            }
        }
    }
}

int main() {
    int A[SIZE][SIZE] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    int B[SIZE][SIZE] = {{9, 8, 7}, {6, 5, 4}, {3, 2, 1}};
    int C[SIZE][SIZE];

    multiplySquareMatrices(A, B, C);

    printf("Résultat de la multiplication :\n");
    for (int i = 0; i < SIZE; ++i) {
        for (int j = 0; j < SIZE; ++j) {
            printf("%d ", C[i][j]);
        }
        printf("\n");
    }

    return 0;
}
2. Multiplication de Matrices Rectangulaires

Dans ce cas, les deux matrices peuvent avoir des dimensions différentes, mais le nombre de colonnes de la première matrice doit correspondre au nombre de lignes de la deuxième matrice. Voici un exemple de multiplication de matrices rectangulaires en langage C :

#include <stdio.h>

#define ROWS_A 2
#define COLS_A 3
#define COLS_B 2

void multiplyRectangularMatrices(int A[ROWS_A][COLS_A], int B[COLS_A][COLS_B], int C[ROWS_A][COLS_B]) {
    for (int i = 0; i < ROWS_A; ++i) {
        for (int j = 0; j < COLS_B; ++j) {
            C[i][j] = 0;
            for (int k = 0; k < COLS_A; ++k) {
                C[i][j] += A[i][k] * B[k][j];
            }
        }
    }
}

int main() {
    int A[ROWS_A][COLS_A] = {{1, 2, 3}, {4, 5, 6}};
    int B[COLS_A][COLS_B] = {{9, 8}, {7, 6}, {5, 4}};
    int C[ROWS_A][COLS_B];

    multiplyRectangularMatrices(A, B, C);

    printf("Résultat de la multiplication :\n");
    for (int i = 0; i < ROWS_A; ++i) {
        for (int j = 0; j < COLS_B; ++j) {
            printf("%d ", C[i][j]);
        }
        printf("\n");
    }

    return 0;
}

Ces exemples illustrent différentes situations de multiplication de matrices avec du code en langage C.

AZ

Recent Posts

Outil d’entraînement au texte argumentatif 1er Bac Maroc

Face à un sujet de production écrite, beaucoup d’élèves ressentent une hésitation immédiate. Le thème…

5 jours ago

Réussir le texte argumentatif au 1er Bac

Le texte argumentatif impressionne souvent plus qu’il ne le devrait. Beaucoup d’élèves l’abordent avec une…

5 jours ago

Production écrite 1er Bac Maroc sur La Boîte à merveilles : Exemples PDF

Dans le parcours du 1er Bac au Maroc, la production écrite occupe une place décisive.…

5 jours ago

Tableau de caractérisation d’entreprise et management : Modèles, usages et différences

Observer une entreprise sérieusement demande deux regards distincts. Le premier consiste à identifier sa nature,…

5 jours ago

50 sujets types de production écrite au 1er Bac Maroc : PDF + méthode complète

La production écrite occupe une place importante dans l’épreuve de français au premier baccalauréat marocain.…

6 jours ago

1er bac maroc Le Dernier Jour d’un Condamné fiche de lecture

Le Dernier Jour d’un Condamné occupe une place majeure dans le parcours du 1er bac…

7 jours ago

This website uses cookies.