C
#include <stdio.h>#include <stdlib.h>typedef struct {double *data;int nrows;int ncols;} Matrix;void printMatrix(Matrix *M);void matrixMult(Matrix *A, Matrix *B, Matrix *C);Matrix *createMatrix(int nrows, int ncols);void destroyMatrix(Matrix *M);int main(int argc, char *argv[]){Matrix *A = createMatrix(3, 2);A->data[0] = 1.2;A->data[1] = 2.3;A->data[2] = 3.4;A->data[3] = 4.5;A->data[4] = 5.6;A->data[5] = 6.7;printMatrix(A);Matrix *B = createMatrix(2, 3);B->data[0] = 5.5;B->data[1] = 6.6;B->data[2] = 7.7;B->data[3] = 1.2;B->data[4] = 2.1;B->data[5] = 3.3;printMatrix(B);Matrix *C = createMatrix(3, 3);matrixMult(A, B, C);printMatrix(C);destroyMatrix(A);destroyMatrix(B);destroyMatrix(C);return 0;}Matrix *createMatrix(int nrows, int ncols){Matrix *M = malloc(sizeof(Matrix));M->data = malloc(nrows * ncols * sizeof(double));M->nrows = nrows;M->ncols = ncols;return M;}void destroyMatrix(Matrix *M){free(M->data);free(M);}void printMatrix(Matrix *M){int i, j;printf("[\n");for (i = 0; i < M->nrows; i++) {for (j = 0; j < M->ncols; j++) {printf("%6.3f ", M->data[i * M->ncols + j]);}printf("\n");}printf("]\n\n");}void matrixMult(Matrix *A, Matrix *B, Matrix *C){if (A->ncols != B->nrows) {printf("error: ncols of A does not equal nrows of B\n");}else {int i, j, k;double value;for (i = 0; i < A->nrows; i++) {for (j = 0; j < B->ncols; j++) {value = 0.0;for (k = 0; k < A->ncols; k++) {value += A->data[i * A->ncols + k] * B->data[k * B->ncols + j];}C->data[i * A->nrows + j] = value;}}}}