#include #include #include #include #include #include "matrice.h" struct matrice { int n; int m; double *valeurs; }; static matrice allouer(int n, int m) { matrice mat = (matrice)malloc(sizeof(struct matrice)); assert(mat != NULL); mat->valeurs = (double *)malloc(n * m * sizeof(double)); assert(mat->valeurs); mat->n = n; mat->m = m; return mat; } matrice matrice_creer(int n, int m, double *valeurs) { matrice mat = allouer(n, m); memcpy(mat->valeurs, valeurs, n * m * sizeof(double)); return mat; } int matrice_dimension_1(matrice m) { return m->n; } int matrice_dimension_2(matrice m) { return m->m; } matrice matrice_identite(int n) { matrice mat = allouer(n, n); int i, j; for (i = 0; i < n; i++) for (j = 0; j < n; j++) mat->valeurs[i * n + j] = (i == j)? 1. : 0.; return mat; } matrice matrice_nulle(int n, int m) { matrice mat = allouer(n, m); int i, j; for (i = 0; i < n; i++) for (j = 0; j < m; j++) mat->valeurs[i * m + j] = 0.; return mat; } matrice matrice_somme(matrice a, matrice b) { int i, j; int n = a->n; int m = a->m; matrice mat = allouer(n, m); assert(b->n == n && b->m == m); for (i = 0; i < n; i++) for (j = 0; j < m; j++) mat->valeurs[i * m + j] = a->valeurs[i * m + j] + b->valeurs[i * m + j]; return mat; } matrice matrice_produit(matrice a, matrice b) { int i, j, k; int n = a->n; int m = b->m; int p = a->m; matrice mat = allouer(n, m); assert(b->n == p); for (i = 0; i < n; i++) for (j = 0; j < m; j++) { mat->valeurs[i * p + j] = 0.; for (k = 0; k < p; k++) mat->valeurs[i * m + j] += a->valeurs[i * p + k] * b->valeurs[k * m + j]; } return mat; } void matrice_modifier(matrice m, int i, int j, double nouvelle_valeur) { m->valeurs[i * m->m + j] = nouvelle_valeur; } double matrice_maximum(matrice m, int * pi, int * pj) { int i, j; int imax = 0; int jmax = 0; for (i = 0; i < m->n; i++) for (j = 0; j < m->m; j++) if (m->valeurs[i * m->m + j] > m->valeurs[imax * m->m + jmax]) { imax = i; jmax = j; } if (pi != NULL) *pi = imax; if (pj != NULL) *pj = jmax; return m->valeurs[imax * m->m + jmax]; } void matrice_afficher(matrice m) { int i, j; for (i = 0; i < m->n; i++) { printf("("); for (j = 0; j < m->m - 1; j++) printf("%8.3f \t", m->valeurs[i * m->m + j]); printf("%8.3f)\n", m->valeurs[i * m->m + m->m - 1]); } } void matrice_detruire(matrice m) { free(m->valeurs); free(m); }