#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; }