#include #include #include "matrix.h" // TODO Matrix-Funktionen implementieren Matrix createMatrix(unsigned int rows, unsigned int cols) { if(rows == 0 || cols == 0){ return (Matrix) {0, 0, NULL}; // Compound struct, kann für c99 verwendet werden } MatrixType *arr = malloc(rows * cols * sizeof(MatrixType)); Matrix new_matrix = {rows, cols, arr}; return new_matrix; } void clearMatrix(Matrix *matrix) { free(matrix->buffer); matrix->buffer = NULL; matrix->rows = 0; matrix->cols = 0; } void setMatrixAt(MatrixType value, Matrix matrix, unsigned int rowIdx, unsigned int colIdx) { if(rowIdx < matrix.rows && colIdx < matrix.cols){ *(matrix.buffer + rowIdx * matrix.rows + colIdx) = value; } } MatrixType getMatrixAt(const Matrix matrix, unsigned int rowIdx, unsigned int colIdx) { if(rowIdx >= matrix.rows || colIdx >= matrix.cols){ return 0; } return *(matrix.buffer + rowIdx * matrix.rows + colIdx); } Matrix add(const Matrix matrix1, const Matrix matrix2) { int n1 = matrix1.cols; int m1 = matrix1.rows; int n2 = matrix2.cols; int m2 = matrix2.cols; if(n1 == 1 && m1 == m2){ Matrix new_mat = createMatrix(m2, n2); for(int i = 0; i < m2; i++){ for(int j = 0; j < n2; j++){ *(new_mat.buffer + i * n2 + j) = *(matrix2.buffer + i * n2 + j) + *(matrix1.buffer + i); } } return new_mat; } if(n2 == 1 && m1 == m2){ Matrix new_mat = createMatrix(m1, n1); for(int i = 0; i < m1; i++){ for(int j = 0; j < n1; j++){ *(new_mat.buffer + i * n1 + j) = *(matrix1.buffer + i * n1 + j) + *(matrix2.buffer + i); } } return new_mat; } if(n1 != n2 || m1 != m2){ return (Matrix) {0, 0, NULL}; } Matrix new_mat = createMatrix(n1, m1); for(int i = 0; i < m1; i++){ for(int j = 0; j < n1; j++){ *(new_mat.buffer + i * n1 + j) = *(matrix1.buffer + i * n1 + j) + *(matrix2.buffer + i * n1 + j); } } return new_mat; } Matrix multiply(const Matrix matrix1, const Matrix matrix2) { int m = matrix1.rows; int q = matrix1.cols; int l = matrix2.cols; if(q != matrix2.rows){ return (Matrix) {0, 0, NULL}; } Matrix new_matrix = createMatrix(m, l); MatrixType *new_mat_arr = new_matrix.buffer; for(int i = 0; i < m; i++){ for(int j = 0; j < l; j++){ int sum = 0; for(int k = 0; k < q; k++){ sum += *(matrix1.buffer + i * q + k) * *(matrix2.buffer + k * l + j); } *(new_mat_arr + i * l + j) = sum; } } return new_matrix; }