#include #include #include "matrix.h" // TODO Matrix-Funktionen implementieren Matrix createMatrix(unsigned int rows, unsigned int cols) { Matrix matrix = {NULL, 0, 0}; if (rows == 0 || cols == 0) return matrix; //gibt leere Matrix zurück matrix.buffer = (MatrixType *)calloc(rows * cols, sizeof(MatrixType)); if (matrix.buffer == NULL) //auf verfügbaren Speicherplatz prüfen return matrix; matrix.rows = rows; matrix.cols = cols; return matrix; //Matrix zurückgeben } void clearMatrix(Matrix *matrix) { if (matrix != NULL) { free(matrix->buffer); //Speicherplatz bereinigen matrix->buffer = NULL; //Werte auf 0 setzen 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 != NULL) //Prüft ob Zugriff möglich matrix.buffer[rowIdx * matrix.cols + colIdx] = value; //schreibt 2D element in 1D Liste: Element_Reihe*Matrix_Spalten + Element_Spalte } 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) { // immer Probe, gleiche Zeilen der Matrizen // "Elementweise Addition": Probe, ob matrix gleiche größe hat 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 hat 1 Spalte 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 hat 1 Spalte 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) { MatrixType buffer_add; if (!matrix1.buffer || !matrix2.buffer) // Probe ob leere Matrize vorliegt return createMatrix(0, 0); if (matrix1.cols != matrix2.rows) // Probe ob Spalten1 = Zeilen2 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 += getMatrixAt(matrix1, index, skalar) * getMatrixAt(matrix2, skalar, shift); } setMatrixAt(buffer_add, result_mul, index, shift); } } return result_mul; }