From fffb6dca39c31801493dd1ac60343c764622b874 Mon Sep 17 00:00:00 2001 From: Harun Faizi Date: Thu, 27 Nov 2025 18:47:15 +0100 Subject: [PATCH] neueste Version mit Kommentaren --- .idea/misc.xml | 5 +++++ matrix.c | 35 +++++++++++++++++++++++------------ matrix.h | 4 +++- matrix.o | Bin 4865 -> 4837 bytes runMatrixTests.exe | Bin 85906 -> 85906 bytes 5 files changed, 31 insertions(+), 13 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index bedf918..53624c9 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -5,6 +5,11 @@ diff --git a/matrix.c b/matrix.c index 5bdaacc..7898d9d 100644 --- a/matrix.c +++ b/matrix.c @@ -13,7 +13,7 @@ Matrix createMatrix(unsigned int rows, unsigned int cols) if(rows==0 || cols==0){ m.rows = 0; m.cols = 0; - m.buffer = NULL; + m.buffer = NULL; //kein gültiger Speicher return m; } @@ -25,7 +25,7 @@ Matrix createMatrix(unsigned int rows, unsigned int cols) return m; } -void clearMatrix(Matrix *matrix) +void clearMatrix(Matrix *matrix) //um Matrix wieder aufzuräumen { // falls Speicher existiert (buffer NICHT NULL ist): freigeben if(matrix->buffer != NULL) @@ -54,11 +54,11 @@ void setMatrixAt(MatrixType value, Matrix matrix, unsigned int rowIdx, unsigned matrix.buffer[index] = value; } -MatrixType getMatrixAt(const Matrix matrix, unsigned int rowIdx, unsigned int colIdx) +MatrixType getMatrixAt(const Matrix matrix, unsigned int rowIdx, unsigned int colIdx) //liest wert an bestimmter Pos. { if (matrix.buffer == NULL || rowIdx >= matrix.rows || colIdx >= matrix.cols) { - return 0; + return 0; //funktioniert nur wegen #define UNDEFINED_MATRIX_VALUE 0 in matrix.h } unsigned int index = rowIdx * matrix.cols + colIdx; @@ -71,7 +71,7 @@ Matrix add(const Matrix matrix1, const Matrix matrix2) Matrix result; //Zeilen müssen gleich sein - if (matrix1.rows != matrix2.rows) + if (matrix1.rows != matrix2.rows) //Wenn nicht gleich, dann ungültige Matrix zurückgeben { result.rows = 0; result.cols = 0; @@ -83,22 +83,28 @@ Matrix add(const Matrix matrix1, const Matrix matrix2) //Spalten müssen gleich sein (mit broadcasting) //Fälle: gleiche Spalten ok, matrix1 hat 1 Spalte, matrix2 hat 1 Spalte //sonst inkompatibel + //Broadcasting --> 3x1 + 3x4 ist möglich, da 3x1 zu 3x4 wird und die erste Spalte einfach kopiert wird in andere Spalten if (matrix1.cols != matrix2.cols && matrix1.cols != 1 && matrix2.cols != 1) - { + { //keine Bedingung erfüllt --> Addition nicht möglich result.rows = 0; result.cols = 0; result.buffer = NULL; return result; } - + //Ergebnis dimension bestimmen + //Zeilen sind immer die gleichen wie bei den Inputs result.rows = matrix1.rows; + //Broadcasting Überprüft --> nimmt immer die grössere Spalte der beiden Matrizen result.cols = (matrix1.cols > matrix2.cols) ? matrix1.cols : matrix2.cols; + //Speicher reservieren für Ergebnis-Matrix result.buffer = malloc(result.rows * result.cols * sizeof(MatrixType)); - for (unsigned int r = 0; r < result.rows; r++) + + //Addition mit Broadcasting + for (unsigned int r = 0; r < result.rows; r++) //jede Zeile durchlaufen { - for (unsigned int c = 0; c < result.cols; c++) + for (unsigned int c = 0; c < result.cols; c++) //jede Spalte durchlaufen { // Bestimme Spalte für matrix1: // Wenn nur 1 Spalte -> immer Spalte 0 benutzen @@ -107,9 +113,11 @@ Matrix add(const Matrix matrix1, const Matrix matrix2) // Bestimme Spalte für matrix2: unsigned int c2 = (matrix2.cols == 1) ? 0 : c; + // Werte aus beiden Matrizen holen MatrixType v1 = getMatrixAt(matrix1, r, c1); MatrixType v2 = getMatrixAt(matrix2, r, c2); + //Beide Werte addieren und in result speichern setMatrixAt(v1 + v2, result, r, c); } } @@ -122,6 +130,7 @@ Matrix multiply(const Matrix matrix1, const Matrix matrix2) { Matrix result; + //Matrixmultiplikation: innere Dimensionen müssen übereinstimmen if(matrix1.cols != matrix2.rows) { result.rows = 0; @@ -130,12 +139,14 @@ Matrix multiply(const Matrix matrix1, const Matrix matrix2) return result; } - + //Größe der Ergebnismatrix bestimmen result.rows = matrix1.rows; result.cols = matrix2.cols; - + //Speicher für Ergebnis result.buffer = malloc(result.rows * result.cols * sizeof(MatrixType)); + + //Matrixmultiplikation durchführen for (unsigned int r = 0; r < result.rows; r++) { for (unsigned int c = 0; c < result.cols; c++) @@ -150,7 +161,7 @@ Matrix multiply(const Matrix matrix1, const Matrix matrix2) sum += a * b; } - + //Summe in Ergebniszelle schreiben setMatrixAt(sum, result, r, c); } } diff --git a/matrix.h b/matrix.h index 9acce0a..2ac706a 100644 --- a/matrix.h +++ b/matrix.h @@ -6,10 +6,12 @@ typedef float MatrixType; // TODO Matrixtyp definieren + + typedef struct { unsigned int rows; unsigned int cols; - MatrixType* buffer; //buffer Pointer zeigt auf Heap, mit malloc dort dann Speicher reservieren + MatrixType* buffer; //Zeiger auf dynamisch reservierten Speicher, damit Matrix beliebig groß zur Laufzeit } Matrix; diff --git a/matrix.o b/matrix.o index 9119c553204188083daf145cce25b8531df92bab..e74d51ffb97f88fa61ff8baa012156436bf622ad 100644 GIT binary patch delta 601 zcmXw$PiPZC6vp41{nOnvyBo2^LpOLRZBDUPPl8e+C=v?kL2reoO zrxw6^*u(&1*GRN>C9!tF6~EaDF{L!|m1rv?xGIL!Gpy%8O|?o)&d&0w0Nw z+6&Buz8;|7_)h0r;$P3P<;E{c8CR{v=~|_wu;u7G4j@IRQr%bdg=``TO zNIGfH09|>@aB)+7F~+8TP=|e~A?sq-x)i3{U)wr_YW7Q&o2IXcYQoP%3N`DPelH zv%aAf^{lS+y*18FdQpR`MZ*iTmW#_v90w`C}^cZFQs5bM3F*Llb8h3D9LU~DOgOc zm#AfZ1~1a~&|U=bu%J>yz^VtYg7hQ^nqG=tL?VdbysQ~`GjD$Le=`iP*>n4NXdHKg zux&4NB$SW=))3%{*IQC#72ut>9>q7_hnS-10QbCKM?*!b_fWFRBN)ZUd<0{-%ySr1 zHVuHMehn*V&ylElDO?@3hc=zz>S%c3H#&oqQsg`A1V1m;aE&*mesuVLd5E?C@(H<# z7x|#lk5PVInZPCfQhA1PKdn|!o&7`|Tm1X3gY&ar>B>CWn4WTqx$-H%|0HY{(q&gd4wEdgnCx-(j00I%C{ z05BKOl$oT(@44R?J4gYHBIWyw)VI3>*1N!p`{)+h)BQ07H;TSOJbJAspO2R}R Q3FCY|yoE*o^4N9!3U@y3ZodC%NSoE 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 O>@_tl?_|(FM*KgZe!7(a delta 4689 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