#include #include #include "matrix.h" // TODO Matrix-Funktionen implementieren Matrix createMatrix(unsigned int rows, unsigned int cols) { Matrix m = {NULL, 0, 0}; if (rows == 0 || cols == 0) return m; m.buffer = (MatrixType *)calloc(rows * cols, sizeof(MatrixType)); if (m.buffer == NULL) return m; m.rows = rows; m.cols = cols; return m; } void clearMatrix(Matrix *matrix) { if (matrix != NULL) { free(matrix->buffer); matrix->buffer = NULL; matrix->rows = 0; matrix->cols = 0; } } void setMatrixAt(MatrixType value, Matrix matrix, unsigned int rowIdx, unsigned int colIdx) // Matrix matrix zu Matrix *matrix, empfehlung { if (rowIdx < matrix.rows && colIdx < matrix.cols && matrix.buffer != NULL) matrix.buffer[rowIdx * matrix.cols + colIdx] = value; } MatrixType getMatrixAt(const Matrix matrix, unsigned int rowIdx, unsigned int colIdx) { if (rowIdx >= matrix.rows || colIdx >= matrix.cols || matrix.buffer == NULL) return 0; // Sicherheitscheck return matrix.buffer[rowIdx * matrix.cols + colIdx]; } // TODO: Funktionen implementieren Matrix add(const Matrix matrix1, const Matrix matrix2) { // check, equal rows // "Elementweise Addition": test, if two matrix has exact size if (matrix1.rows == matrix2.rows && matrix1.cols == matrix2.cols) { Matrix result_add = createMatrix(matrix1.rows, matrix1.cols); for (int r = 0; r < matrix1.rows; r++) { for (int c = 0; c < matrix1.cols; c++) { // first version: matrix_add[r][c] = matrix1[r][c] + matrix2[r][c] MatrixType sum = getMatrixAt(matrix1, r, c) + getMatrixAt(matrix2, r, c); setMatrixAt(sum, result_add, r, c); } } return result_add; } // "Broadcasting": matrix1 has 1 collum if (matrix1.rows == matrix2.rows && matrix1.cols == 1) { Matrix result_add = createMatrix(matrix1.rows, matrix2.cols); for (int r = 0; r < matrix1.rows; r++) { for (int c = 0; c < matrix2.cols; c++) { MatrixType sum = getMatrixAt(matrix2, r, c) + getMatrixAt(matrix1, r, 0); setMatrixAt(sum, result_add, r, c); } } return result_add; } // "Broadcasting": matrix2 has 1 collum if (matrix1.rows == matrix2.rows && matrix2.cols == 1) { Matrix result_add = createMatrix(matrix1.rows, matrix1.cols); for (int r = 0; r < matrix1.rows; r++) { for (int c = 0; c < matrix1.cols; c++) { MatrixType sum = getMatrixAt(matrix1, r, c) + getMatrixAt(matrix2, r, 0); setMatrixAt(sum, result_add, r, c); } } return result_add; } return createMatrix(0, 0); } Matrix multiply(const Matrix matrix1, const Matrix matrix2) { // Needed: rows/Zeilen, collums/Spalten MatrixType buffer_add; // Probe ob Spalten1 = Zeilen2 if (matrix1.cols != matrix2.rows) return createMatrix(0, 0); Matrix result_mul = createMatrix(matrix1.rows, matrix2.cols); // "" for (unsigned int index = 0; index < matrix1.rows; index++) { for (unsigned int shift = 0; shift < matrix2.cols; shift++) { buffer_add = 0; for (unsigned int skalar = 0; skalar < matrix1.cols; skalar++) { // buffer_add += matrix1[index][skalar]*matrix2[skalar][shift]; buffer_add += getMatrixAt(matrix1, index, skalar) * getMatrixAt(matrix2, skalar, shift); } // matrix_mul[index][shift] = buffer_add; setMatrixAt(buffer_add, result_mul, index, shift); // result als Pointer, also mit &result } } return result_mul; }