M1

#include <stdio.h>
#include <stdlib.h>

#define M 4
#define F 2
#define O 3

/**
 * On sait que la convolution entre une matrice `h` et `f`, donnant
 * pour résultat la matrice `g`, a pour formule:
 *
 *  g(i, j) = Σ (k=-M/2;M/2) Σ (l=-F/2;F/2) h(l, k) * f(i - l, j - k)
 *
 * Avec M, la taille de la matrice `h` et F la taille de la matrice `f`.
 */
void convolution(int h[M][M], int f[F][F], int g[O][O]) {
  int i, j, k, l;

  for (i = 0; i < O; i++) {
    for (j = 0; j < O; j++) {
      // Ici, on applique la formule pour calculer la valeur
      // de la case courante dans la matrice de sortie.
      for (k = -(M/2); k <= (M/2); k++) {
        for (l = -(F/2); l <= (F/2); l++) {
          g[i][j] = h[l][k] * f[i - l][j - k];
        }
      }
    }
  }
}

int main() {
  int h[M][M] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {3, 2, 6, 7},
    {4, 6, 1, 2}
  };

  int f[F][F] = {
    {1, 2},
    {3, 4}
  };

  int g[O][O];

  int i, j;

  convolution(h, f, g);

  for (i = 0; i < O; i++) {
    printf("| ");

    for (j = 0; j < O; j++) {
      printf(" %10d |", g[i][j]);
    }

    printf("\n");
  }

  return 0;
}