From f0cd9abe2b63c961b843427b38baad3a99ace3c4 Mon Sep 17 00:00:00 2001 From: Giorgi Kesidis Date: Mon, 10 Nov 2025 19:54:47 +0100 Subject: [PATCH] Matrix fertig --- matrix.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 74 insertions(+), 9 deletions(-) diff --git a/matrix.c b/matrix.c index 289922f..f67e8e7 100644 --- a/matrix.c +++ b/matrix.c @@ -1,22 +1,24 @@ #include #include #include "matrix.h" +#include // TODO Matrix-Funktionen implementieren Matrix createMatrix(unsigned int rows, unsigned int cols) -{ +{ Matrix matrix; matrix.rows = rows; matrix.cols = cols; - matrix.data = (MatrixType *)malloc(rows* cols* sizeof(MatrixType)); + matrix.data = (MatrixType *)malloc(rows * cols * sizeof(MatrixType)); - if(matrix.data == NULL){ + if (matrix.data == NULL) + { matrix.rows = 0; matrix.cols = 0; - + return matrix; } @@ -31,35 +33,98 @@ Matrix createMatrix(unsigned int rows, unsigned int cols) void clearMatrix(Matrix *matrix) { - if(matrix->data != NULL) + if (matrix->data != NULL) { free(matrix->data); matrix->data = NULL; } matrix->rows = 0; - matrix->cols =0; - + matrix->cols = 0; } void setMatrixAt(MatrixType value, Matrix matrix, unsigned int rowIdx, unsigned int colIdx) { - if(rowIdx >= matrix.rows || colIdx >= matrix.cols) + if (rowIdx >= matrix.rows || colIdx >= matrix.cols) { fprintf(stderr, "Fehler: Ungültiger Index (%u, %u) bei Matrixgröße %u x %u\n", rowIdx, colIdx, matrix.rows, matrix.cols); + return; // abbruch falls fehler } - matrix.data[rowIdx * matrix.cols +colIdx] = value; + matrix.data[rowIdx * matrix.cols + colIdx] = value; } MatrixType getMatrixAt(const Matrix matrix, unsigned int rowIdx, unsigned int colIdx) { + if (rowIdx >= matrix.rows || colIdx >= matrix.cols) + { + fprintf(stderr, "Fehler: Ungültiger Index (%u, %u) bei Matrixgröße %u x %u\n", rowIdx, colIdx, matrix.rows, matrix.cols); + return UNDEFINED_MATRIX_VALUE; + } + + return matrix.data[rowIdx * matrix.cols + colIdx]; } Matrix add(const Matrix matrix1, const Matrix matrix2) { + if (matrix1.rows != matrix2.rows || matrix1.cols != matrix2.cols) + { + fprintf(stderr, "Fehler: Matrizen haben unterschiedliche Größen (%u x %u) und (%u x %u)\n", + matrix1.rows, matrix1.cols, matrix2.rows, matrix2.cols); + + Matrix empty = {0, 0, NULL}; + return empty; + } + + Matrix result = createMatrix(matrix1.rows, matrix1.cols); + + if (result.data == NULL) + { + fprintf(stderr, "Fehler: Speicher konnte nicht reserviert werden!\n"); + return result; + } + + for (int i = 0; i < matrix1.rows; i++) + { + for (int j = 0; j < matrix1.cols; j++) + { + result.data[i * result.cols + j] = matrix1.data[i * matrix1.cols + j] + matrix2.data[i * matrix2.cols + j]; + } + } + return result; } Matrix multiply(const Matrix matrix1, const Matrix matrix2) { + if (matrix1.cols != matrix2.rows) + { + fprintf(stderr, "Fehler: Matrizen der Dimension (%u x %u) und (%u x %u) koennen nicht multipliziert werden\n", + matrix1.rows, matrix1.cols, matrix2.rows, matrix2.cols); + + Matrix empty = {0, 0, NULL}; + return empty; + } + + Matrix result = createMatrix(matrix1.rows, matrix2.cols); + + if (result.data == NULL) + { + fprintf(stderr, "Fehler: Speicher konnte nicht reserviert werden!\n"); + return result; + } + + for (int i = 0; i < matrix1.rows; i++) + { + for (int j = 0; j < matrix2.cols; j++) + { + MatrixType sum = 0.0; + + for (int k = 0; k < matrix1.cols; k++) + { + sum += matrix1.data[i * matrix1.cols + k] * matrix2.data[k * matrix2.cols + j]; + } + result.data[i * result.cols +j] = sum; + } + } + return result; } \ No newline at end of file