#include #include #include #include "matrice.h" struct matrice { indice dim1; indice dim2; double *elements; }; static double * elem (matrice mat, indice i, indice j) { assert ((i) < (mat)->dim1 && (j) < (mat)->dim2); return mat->elements + i * mat->dim2 + j; } matrice mat_creer_matrice_nulle (indice dim1, indice dim2) { matrice m; m = (matrice) malloc (sizeof (struct matrice)); assert (m != NULL); m->dim1 = dim1; m->dim2 = dim2; m->elements = calloc (dim1 * dim2, sizeof (double)); assert (m->elements != NULL); return m; } void mat_liberer (matrice m) { free (m->elements); free (m); } matrice mat_creer_copie (matrice source) { matrice copie; copie = mat_creer_matrice_nulle (source->dim1, source->dim2); memcpy (copie->elements, source->elements, source->dim1 * source->dim2 * sizeof (double)); return copie; } void mat_affecter_element (matrice m, indice i, indice j, double valeur) { *elem (m, i, j) = valeur; } double mat_valeur_element (matrice m, indice i, indice j) { return *elem (m, i, j); } matrice mat_somme (matrice a, matrice b) { matrice m; indice i, j; assert (a->dim1 == b->dim1 && a->dim2 == b->dim2); m = mat_creer_matrice_nulle (a->dim1, b->dim2); for (i = 0; i < a->dim1; i++) for (j = 0; j < a->dim2; j++) *elem (m, i, j) = *elem (a, i, j) + *elem (b, i, j); return m; } matrice mat_produit (matrice a, matrice b) { matrice m; assert (a->dim2 == b->dim1); m = mat_creer_matrice_nulle (a->dim1, b->dim2); { indice i, j, k; for (i = 0; i < a->dim1; i++) for (j = 0; j < b->dim2; j++) { *elem (m, i, j) = 0; for (k = 0; k < a->dim2; k++) *elem (m, i, j) += *elem (a, i, j) * *elem (b, j, k); } } return m; } matrice mat_transposee (matrice m) { matrice transposee; indice i, j; transposee = mat_creer_matrice_nulle (m->dim2, m->dim1); for (i = 0; i < m->dim1; i++) for (j = 0; j < m->dim2; j++) *elem (transposee, j, i) = *elem (m, i, j); return transposee; }