Algèbre matricielle et calcul scientifique en langage C

@joekakone

Joseph Konka @joekakone

03/03/2026 · 10 min

Implémentez les opérations matricielles fondamentales en C : addition, soustraction, multiplication par un scalaire, transposée, trace et produit matriciel à 3 boucles.

L'algèbre linéaire est au cœur du calcul scientifique, du traitement du signal, de l'imagerie 3D, de la physique numérique et des algorithmes d'apprentissage automatique (Machine Learning). La rapidité et la proximité matérielle du langage C en font historiquement le langage d'élection pour concevoir des bibliothèques de calcul matriciel de haute performance (telles que BLAS ou LAPACK).

Cette leçon détaille l'implémentation en C des opérations matricielles majeures : la transposée, la trace, l'addition et le produit de deux matrices.


1. Transposée d'une matrice#

La transposée d'une matrice \(A\) de dimensions \(N \times M\) est une matrice \(T\) de dimensions \(M \times N\) obtenue en échangeant ses lignes et ses colonnes :

\[T_{j,i} = A_{i,j} \quad \text{pour tout } 0 \le i < N \text{ et } 0 \le j < M\]
flowchart LR
    subgraph A [Matrice A : 3 Lignes x 2 Colonnes]
        A_val["| 1  2 |\n| 3  4 |\n| 5  6 |"]
    end
    subgraph T [Matrice Transposée T : 2 Lignes x 3 Colonnes]
        T_val["| 1  3  5 |\n| 2  4  6 |"]
    end
    A -->|Échange i et j| T
transposee.c
#include <stdio.h>

#define N 3
#define M 2

int main(void)
{
    int A[N][M] = {
        {1, 2},
        {3, 4},
        {5, 6}
    };
    int T[M][N];

    // Calcul de la transposée
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < M; j++)
        {
            T[j][i] = A[i][j];
        }
    }

    // Affichage de la matrice transposée
    printf("Matrice transposee T (%d x %d) :\n", M, N);
    for (int i = 0; i < M; i++)
    {
        printf("| ");
        for (int j = 0; j < N; j++)
        {
            printf("%d ", T[i][j]);
        }
        printf("|\n");
    }

    return 0;
}

2. Trace d'une matrice carrée#

La trace d'une matrice carrée \(A\) (\(N \times N\)) est la somme de tous les éléments situés sur sa diagonale principale :

\[\text{Tr}(A) = \sum_{i=0}^{N-1} A_{i,i} = A_{0,0} + A_{1,1} + \dots + A_{N-1,N-1}\]
trace.c
#include <stdio.h>

#define TAILLE 3

int main(void)
{
    int A[TAILLE][TAILLE] = {
        { 4,  7,  2},
        { 3, -1,  8},
        { 6,  0,  5}
    };

    int trace = 0;
    // Une seule boucle for suffit pour parcourir la diagonale !
    for (int i = 0; i < TAILLE; i++)
    {
        trace += A[i][i];
    }

    printf("La trace de la matrice est : %d (4 + (-1) + 5 = 8)\n", trace);
    return 0;
}

3. Somme de deux matrices#

Pour additionner deux matrices \(A\) et \(B\), elles doivent avoir exactement les mêmes dimensions \(N \times M\). Chaque élément de la matrice résultat \(C\) est la somme des éléments correspondants :

\[C_{i,j} = A_{i,j} + B_{i,j}\]
addition_matrices.c
#include <stdio.h>

#define LIGNES 2
#define COLS 3

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

    for (int i = 0; i < LIGNES; i++)
    {
        for (int j = 0; j < COLS; j++)
        {
            C[i][j] = A[i][j] + B[i][j];
        }
    }

    printf("Somme A + B :\n");
    for (int i = 0; i < LIGNES; i++)
    {
        printf("| ");
        for (int j = 0; j < COLS; j++)
        {
            printf("%2d ", C[i][j]);
        }
        printf("|\n");
    }

    return 0;
}

4. Le Produit matriciel (\(C = A \times B\))#

Le produit matriciel est l'opération la plus célèbre et la plus exigeante de l'algèbre linéaire :

[!IMPORTANT] Pour que le produit \(A \times B\) soit mathématiquement possible, le nombre de colonnes de \(A\) doit être rigoureusement égal au nombre de lignes de \(B\) : $\(\underbrace{A}_{(N \times M)} \times \underbrace{B}_{(M \times P)} = \underbrace{C}_{(N \times P)}\)$

Chaque élément \(C_{i,k}\) est obtenu en calculant le produit scalaire de la ligne \(i\) de \(A\) par la colonne \(k\) de \(B\) :

\[C_{i,k} = \sum_{j=0}^{M-1} A_{i,j} \times B_{j,k}\]

Algorithme à 3 boucles imbriquées en C#

produit_matriciel.c
#include <stdio.h>

#define N 2 // Lignes de A
#define M 3 // Colonnes de A et Lignes de B
#define P 2 // Colonnes de B

int main(void)
{
    int A[N][M] = {
        {1, 2, 3},
        {4, 5, 6}
    };

    int B[M][P] = {
        {7, 8},
        {9, 1},
        {2, 3}
    };

    // Matrice résultat C de dimension N x P (2 x 2), initialisée à zéro
    int C[N][P] = {0};

    // 1. Parcours des lignes de A
    for (int i = 0; i < N; i++)
    {
        // 2. Parcours des colonnes de B
        for (int k = 0; k < P; k++)
        {
            // 3. Calcul de la somme des produits
            for (int j = 0; j < M; j++)
            {
                C[i][k] += A[i][j] * B[j][k];
            }
        }
    }

    // Affichage de la matrice produit
    printf("Produit matriciel C = A x B (%d x %d) :\n", N, P);
    for (int i = 0; i < N; i++)
    {
        printf("| ");
        for (int k = 0; k < P; k++)
        {
            printf("%4d ", C[i][k]);
        }
        printf("|\n");
    }

    return 0;
}
Sortie console
Produit matriciel C = A x B (2 x 2) :
|   31   19 |
|   85   55 |

5. Test de symétrie d'une matrice carrée#

Une matrice carrée \(A\) (\(N \times N\)) est dite symétrique si elle est égale à sa transposée (\(A_{i,j} = A_{j,i}\) pour toutes les paires \(i, j\)) :

test_symetrie.c
#include <stdio.h>
#include <stdbool.h>

#define TAILLE 3

bool EstSymetrique(const int mat[TAILLE][TAILLE])
{
    // Il suffit de comparer le triangle supérieur au triangle inférieur (j > i)
    for (int i = 0; i < TAILLE; i++)
    {
        for (int j = i + 1; j < TAILLE; j++)
        {
            if (mat[i][j] != mat[j][i])
            {
                return false; // Asymétrie détectée !
            }
        }
    }
    return true;
}

int main(void)
{
    int S[TAILLE][TAILLE] = {
        {1, 7, 3},
        {7, 4, -5},
        {3, -5, 6}
    };

    if (EstSymetrique(S))
    {
        printf("La matrice est PARFAITEMENT SYMETRIQUE.\n");
    }
    else
    {
        printf("La matrice N'EST PAS symetrique.\n");
    }

    return 0;
}

Vous maîtrisez désormais les algorithmes matriciels en C. Rassemblons ces compétences dans la section d'applications pratiques dédiée aux algorithmes de tri et de recherche.

Commentaires

Inscrivez-vous à une formation complète

Voir le catalogue