diff --git a/matrix.c b/matrix.c index 477d480..203c4aa 100644 --- a/matrix.c +++ b/matrix.c @@ -1,6 +1,7 @@ #include #include #include "matrix.h" +#include // TODO Matrix-Funktionen implementieren @@ -129,6 +130,8 @@ Matrix add(const Matrix matrix1, const Matrix matrix2) } */ +//Currently working version +/* Matrix add(const Matrix matrix1, const Matrix matrix2) { //check if the matrices are able to be added (same size) @@ -156,6 +159,57 @@ Matrix add(const Matrix matrix1, const Matrix matrix2) } return outputMatrix; +} +*/ + + +Matrix add(const Matrix matrix1, const Matrix matrix2) +{ + + bool doBroadcast = false; + Matrix larger, smaller; + + if(matrix1.rows == matrix2.rows && matrix1.cols == matrix2.cols){ + larger = matrix1; + smaller = matrix2; + } + else if (matrix1.rows == matrix2.rows && matrix2.cols == 1) + { + larger = matrix1; + smaller = matrix2; + doBroadcast = true; + } + else if (matrix1.rows == matrix2.rows && matrix1.cols == 1) + { + larger = matrix2; + smaller = matrix1; + doBroadcast = true; + } + else{ + Matrix m = {NULL, 0, 0}; + return m; + } + + Matrix outputMatrix = createMatrix(larger.rows, larger.cols); + if(doBroadcast){ + for(int i = 0; i < outputMatrix.rows; i++){ + MatrixType broadcastValue = smaller.buffer[i]; + for(int j = 0; j < outputMatrix.cols; j++){ + outputMatrix.buffer[i * outputMatrix.cols + j] = larger.buffer[i * larger.cols + j] + broadcastValue; + } + } + } else{ + for (int i = 0; i < matrix1.rows;i++) { + for (int j = 0; j < matrix1.cols; j++) { + // how this should work in normal Matrix version: + // outputmatrix.buffer[i][j] = matrix1.buffer[i][j] + matrix2.buffer[i][j]; + outputMatrix.buffer[i * outputMatrix.cols + j] = matrix1.buffer[i * matrix1.cols + j] + matrix2.buffer[i * matrix2.cols + j]; + } + } + } + return outputMatrix; + + } /*