From ede0bd8bd8b41c747ccde430f1add276a3312aa2 Mon Sep 17 00:00:00 2001 From: Kristin Date: Sat, 22 Nov 2025 12:15:04 +0100 Subject: [PATCH] addmatrix mit broadcasten --- makefile | 13 ++--- matrix.c | 173 +++++++++++++++++++++++++++++++++++++++++++++++++++---- matrix.h | 5 ++ 3 files changed, 172 insertions(+), 19 deletions(-) diff --git a/makefile b/makefile index 5d94684..376d643 100644 --- a/makefile +++ b/makefile @@ -57,12 +57,9 @@ imageInputTests: imageInput.o imageInputTests.c $(unityfolder)/unity.c # -------------------------- # Clean # -------------------------- -#clean: -#ifeq ($(OS),Windows_NT) -# del /f *.o *.exe -#else -# rm -f *.o mnist runMatrixTests runNeuralNetworkTests runImageInputTests -#endif -# clean für windows clean: - rm -f *.o *.exe \ No newline at end of file +ifeq ($(OS),Windows_NT) + del /f *.o *.exe +else + rm -f *.o mnist runMatrixTests runNeuralNetworkTests runImageInputTests +endif \ No newline at end of file diff --git a/matrix.c b/matrix.c index 7a8dcac..2a33d14 100644 --- a/matrix.c +++ b/matrix.c @@ -1,6 +1,8 @@ #include "matrix.h" +#include #include #include + // TODO Matrix-Funktionen implementieren /*typedef struct { unsigned int rows; //Zeilen @@ -8,6 +10,12 @@ MatrixType *buffer; //Zeiger auf Speicherbereich Reihen*Spalten } Matrix;*/ Matrix createMatrix(unsigned int rows, unsigned int cols) { + + Matrix errorMatrix = {0, 0, NULL}; + if (rows == 0 || cols == 0) { + + return errorMatrix; + } MatrixType *buffer = malloc(rows * cols * sizeof(MatrixType)); // Speicher reservieren, malloc // liefert Zeiger auf Speicher @@ -20,6 +28,7 @@ void clearMatrix(Matrix *matrix) { matrix->cols = UNDEFINED_MATRIX_VALUE; free((*matrix).buffer); // Speicher freigeben } + void setMatrixAt(const MatrixType value, Matrix matrix, const unsigned int rowIdx, // Kopie der Matrix wird übergeben const unsigned int colIdx) { @@ -40,26 +49,168 @@ MatrixType getMatrixAt(const Matrix matrix, return value; } + +Matrix broadCastCols(const Matrix matrix, const unsigned int rows, + const unsigned int cols) { + + Matrix copy = createMatrix( + rows, cols); // Matrix 1 Kopie erstellen mit Dimensionen von Matrix2 + for (int r = 0; r < rows; r++) { + + MatrixType value = getMatrixAt(matrix, r, 0); + for (int c = 0; c < cols; c++) { + + setMatrixAt(value, copy, r, c); + } + } + + return copy; +} +Matrix broadCastRows(const Matrix matrix, const unsigned int rows, + const unsigned int cols) { + + Matrix copy = createMatrix(rows, cols); + + for (int c = 0; c < cols; c++) { + MatrixType value = getMatrixAt(matrix, 0, c); + + for (int r = 0; r < rows; r++) { + + setMatrixAt(value, copy, r, c); + } + } + + return copy; +} + Matrix add(const Matrix matrix1, const Matrix matrix2) { - // Ergebnismatrix - Matrix result; + // Broadcasting nur bei Vektor und Matrix, Fehlermeldung bei zwei unpassenden + // Matrizen - // Broadcasting nur bei Vektor und Matrix, Fehlermeldung bei zwei unpassender - // Matrix - if (matrix1.rows != matrix2.rows) { + const unsigned int rows1 = matrix1.rows; + const unsigned int rows2 = matrix2.rows; + const unsigned int cols1 = matrix1.cols; + const unsigned int cols2 = matrix2.cols; - // check, which one is smaller - // realloc + const int rowsEqual = ((rows1 == rows2) ? 1 : 0); + + const int colsEqual = ((cols1 == cols2) ? 1 : 0); + + if (rowsEqual && colsEqual) // addieren + + { + Matrix result = createMatrix(rows1, cols1); // Speicher reservieren + + for (int i = 0; i < (rows1 * cols1); i++) { // addieren + + result.buffer[i] = + (matrix1.buffer[i] + + matrix2.buffer[i]); // buffer[i] ⇔ *(buffer + i) Adresse = + // Startadresse + (i * sizeof(MatrixType)) + } + + return result; // zurückgeben } - if (matrix1.cols != matrix2.cols) { + else if (rowsEqual && !colsEqual) { + + if (cols1 == 1) { + + Matrix result = createMatrix(rows2, cols2); + + Matrix copy1 = broadCastCols(matrix1, rows2, cols2); + + for (int i = 0; i < (rows2 * cols2); i++) { // addieren + + result.buffer[i] = + (copy1.buffer[i] + + matrix2.buffer[i]); // buffer[i] ⇔ *(buffer + i) Adresse = + // Startadresse + (i * sizeof(MatrixType)) + } + return result; + + // add und return + + } else if (cols2 == 1) { + + Matrix result = createMatrix(rows1, cols1); + + Matrix copy2 = broadCastCols(matrix2, rows1, cols1); + + for (int i = 0; i < (rows1 * cols1); i++) { // addieren + + result.buffer[i] = + (matrix1.buffer[i] + + copy2.buffer[i]); // buffer[i] ⇔ *(buffer + i) Adresse = + // Startadresse + (i * sizeof(MatrixType)) + } + return result; + // add und return + + } + + else { + + printf("Fehlermeldung"); // vielleicht Fehlermeldung ändern zu + // Programmabbruch + Matrix error = {0, 0, NULL}; + return error; + } + } - // Speicher reservieren + else if (!rowsEqual && colsEqual) { - // Matrix addieren + if (rows1 == 1) { - return result; + Matrix result = createMatrix(rows2, cols2); + + Matrix copy1 = broadCastRows(matrix1, rows2, cols2); + + for (int i = 0; i < (rows2 * cols2); i++) { // addieren + + result.buffer[i] = + (copy1.buffer[i] + + matrix2.buffer[i]); // buffer[i] ⇔ *(buffer + i) Adresse = + // Startadresse + (i * sizeof(MatrixType)) + } + return result; + + // add und return + + } else if (rows2 == 1) { + + Matrix result = createMatrix(rows1, cols1); + + Matrix copy2 = broadCastCols(matrix2, rows1, cols1); + // add und return + + for (int i = 0; i < (rows1 * cols1); i++) { // addieren + + result.buffer[i] = + (matrix1.buffer[i] + + copy2.buffer[i]); // buffer[i] ⇔ *(buffer + i) Adresse = + // Startadresse + (i * sizeof(MatrixType)) + } + return result; + + } + + else { + + printf("Fehlermeldung"); // vielleicht Fehlermeldung ändern zu + // Programmabbruch + Matrix error = {0, 0, NULL}; + return error; + } + } + + else { + printf( + "Fehlermeldung"); // vielleicht Fehlermeldung ändern zu Programmabbruch + Matrix error = {0, 0, NULL}; + return error; + } } Matrix multiply(const Matrix matrix1, const Matrix matrix2) { return matrix1; } diff --git a/matrix.h b/matrix.h index ca871ae..812b3a0 100644 --- a/matrix.h +++ b/matrix.h @@ -19,6 +19,11 @@ void setMatrixAt(MatrixType value, Matrix matrix, unsigned int rowIdx, unsigned int colIdx); MatrixType getMatrixAt(const Matrix matrix, unsigned int rowIdx, unsigned int colIdx); + +Matrix broadCastCols(const Matrix matrix, const unsigned int rows, + const unsigned int cols); +Matrix broadCastRows(const Matrix matrix, const unsigned int rows, + const unsigned int cols); Matrix add(const Matrix matrix1, const Matrix matrix2); Matrix multiply(const Matrix matrix1, const Matrix matrix2);