diff --git a/matrix.c b/matrix.c index 50e10ce..7e98811 100644 --- a/matrix.c +++ b/matrix.c @@ -5,6 +5,8 @@ // TODO Matrix-Funktionen implementieren +enum addModes{sameDimensions, colVec, rowVec}; + Matrix createMatrix(unsigned int rows, unsigned int cols) { Matrix m; @@ -12,7 +14,7 @@ Matrix createMatrix(unsigned int rows, unsigned int cols) m.cols = cols; m.buffer = NULL; - if(rows == 0 || cols == 0) + if(rows == 0 || cols == 0) { m.rows = 0; @@ -22,6 +24,7 @@ Matrix createMatrix(unsigned int rows, unsigned int cols) } m.buffer = calloc(rows * cols, sizeof(MatrixType)); + if (m.buffer == NULL) { @@ -36,17 +39,36 @@ Matrix createMatrix(unsigned int rows, unsigned int cols) void clearMatrix(Matrix *matrix) { + if (matrix->buffer == NULL) + { + matrix->rows = 0; + matrix->cols = 0; + matrix->buffer = NULL; + return matrix; + } + else + { + free(matrix->buffer); matrix->rows = 0; matrix->cols = 0; matrix->buffer = NULL; + + } } void setMatrixAt(MatrixType value, Matrix matrix, unsigned int rowIdx, unsigned int colIdx) { - - matrix.buffer[(rowIdx * matrix.cols) + colIdx] = value; //wir setzen den data-Wert an der Stelle (rowIdx*Spalten + colIdx) auf den Wert von value + + if(matrix.buffer == NULL || rowIdx >= matrix.rows || colIdx >= matrix.cols) + { + return; + } + else + { + matrix.buffer[(rowIdx * matrix.cols) + colIdx] = value; //wir setzen den data-Wert an der Stelle (rowIdx*Spalten + colIdx) auf den Wert von value + } } MatrixType getMatrixAt(const Matrix matrix, unsigned int rowIdx, unsigned int colIdx) @@ -59,110 +81,149 @@ MatrixType getMatrixAt(const Matrix matrix, unsigned int rowIdx, unsigned int co return matrix.buffer[(rowIdx * matrix.cols) + colIdx]; } -static int can_add(Matrix matrix1, Matrix matrix2) { +static int get_add_mode(Matrix matrix1, Matrix matrix2) { - int can_add; + int get_add_mode; if(matrix1.cols == matrix2.cols && matrix1.rows == matrix2.rows){ - can_add = 1; + get_add_mode = sameDimensions; } else if(matrix1.cols == 1 && matrix1.rows == matrix2.rows){ - can_add = 2; + get_add_mode = colVec; } else if(matrix2.cols == 1 && matrix1.rows == matrix2.rows){ - can_add = 3; + get_add_mode = colVec; } else if(matrix1.rows == 1 && matrix1.cols == matrix2.cols){ - can_add = 4; + get_add_mode = rowVec; } else if(matrix2.rows == 1 && matrix1.cols == matrix2.cols){ - can_add = 5; + get_add_mode = rowVec; } - else{ - - can_add = 0; - - } - - return can_add; - } - -Matrix add(const Matrix matrix1, const Matrix matrix2) //wir addieren nur wenn beide Matrizen gleich groß sind oder eine von beiden eine Zeile oder eine Spalte besitzt -{ - int ok = can_add(matrix1,matrix2); + return get_add_mode; - unsigned int erg_rows = (matrix1.rows == matrix2.rows) ? matrix1.rows : (matrix1.rows == 1 ? matrix2.rows : matrix1.rows); - unsigned int erg_cols = (matrix1.cols == matrix2.cols) ? matrix1.cols : (matrix1.cols == 1 ? matrix2.cols : matrix1.cols); - - Matrix matrix_erg = createMatrix(erg_rows, erg_cols); +} - switch(ok) + + Matrix addSameDim(Matrix matrix1, Matrix matrix2) { - case 1: - + Matrix matrix_erg = createMatrix(matrix1.rows, matrix1.cols); + for(int i = 0; i < (matrix1.rows * matrix1.cols); i++) matrix_erg.buffer[i] = matrix1.buffer[i] + matrix2.buffer[i]; + + return matrix_erg; + + } + + Matrix addColVec(Matrix matrix1, Matrix matrix2) + { + Matrix matrix_erg; + if(matrix1.cols == 1) + { + matrix_erg = createMatrix(matrix2.rows, matrix2.cols); + + for(int i = 0; i < matrix2.rows; i++) + { + for(int j = 0; j < matrix2.cols; j++) + + matrix_erg.buffer[i * matrix2.cols + j] = matrix1.buffer[i * matrix2.cols + j] + matrix2.buffer[i]; + } + + + } + if(matrix2.cols == 1) + { + matrix_erg = createMatrix(matrix1.rows, matrix1.cols); + + for(int i = 0; i < matrix1.rows; i++) + { + for(int j = 0; j < matrix1.cols; j++) + + matrix_erg.buffer[i * matrix1.cols + j] = matrix1.buffer[i] + matrix2.buffer[i * matrix1.cols + j]; + } + } + return matrix_erg; + + + } + + Matrix addRowVec(Matrix matrix1, Matrix matrix2) + { + Matrix matrix_erg; + if(matrix1.rows == 1) + { + matrix_erg = createMatrix(matrix2.rows, matrix2.cols); + + for(int i = 0; i < matrix2.rows; i++) + { + for(int j = 0; j < matrix2.cols; j++) + + matrix_erg.buffer[i * matrix2.cols + j] = matrix1.buffer[i * matrix2.cols + j] + matrix2.buffer[j]; + } + + + } + if(matrix2.rows == 1) + { + matrix_erg = createMatrix(matrix1.rows, matrix1.cols); + + for(int i = 0; i < matrix1.rows; i++) + { + for(int j = 0; j < matrix1.cols; j++) + + matrix_erg.buffer[i * matrix1.cols + j] = matrix1.buffer[j] + matrix2.buffer[i * matrix1.cols + j]; + } + } + return matrix_erg; + } + + + + + Matrix add(const Matrix matrix1, const Matrix matrix2) + { + int ok = get_add_mode(matrix1,matrix2); + + Matrix matrix_erg = createMatrix(0, 0); + + + switch(ok) + { + + + case sameDimensions: + + addSameDim(matrix1, matrix2); break; - case 2: + case colVec: - for(int i = 0; i < erg_rows; i++){ - for(int j = 0; j < erg_cols; j++) + addColVec(matrix1, matrix2); - matrix_erg.buffer[i * erg_cols + j] = matrix1.buffer[i * erg_cols + j] + matrix2.buffer[i]; - } break; - case 3: + case rowVec: - for(int i = 0; i < erg_rows; i++){ - for(int j = 0; j < erg_cols; j++) + addRowVec(matrix1, matrix2); - matrix_erg.buffer[i * erg_cols + j] = matrix1.buffer[i] + matrix2.buffer[i * erg_cols + j]; - } break; - case 4: - - for(int i = 0; i < erg_rows; i++){ - for(int j = 0; j < erg_cols; j++) - - matrix_erg.buffer[i * erg_cols + j] = matrix1.buffer[i * erg_cols + j] + matrix2.buffer[j]; - } - break; - - case 5: - - for(int i = 0; i < erg_rows; i++){ - for(int j = 0; j < erg_cols; j++) - - matrix_erg.buffer[i * erg_cols + j] = matrix1.buffer[j] + matrix2.buffer[i * erg_cols + j]; - } - break; - - default: - - matrix_erg.rows = 0; - matrix_erg.cols = 0; - matrix_erg.buffer = NULL; - return matrix_erg; - - } -return matrix_erg; + return matrix_erg; @@ -183,11 +244,11 @@ Matrix multiply(const Matrix matrix1, const Matrix matrix2) int ok = can_multiply(matrix1,matrix2); unsigned int erg_rows = matrix1.rows; unsigned int erg_cols = matrix2.cols; - Matrix matrix_erg = createMatrix(erg_rows, erg_cols); - + Matrix matrix_erg = createMatrix(0, 0); if (ok == 1) { + Matrix matrix_erg = createMatrix(erg_rows, erg_cols); for (int i = 0; i < erg_rows; i++) { @@ -197,22 +258,15 @@ Matrix multiply(const Matrix matrix1, const Matrix matrix2) for (int k = 0; k < matrix1.cols; k++) { - sum += matrix1.buffer[i * matrix1.cols + k] * matrix2.buffer[k * matrix2.cols + j]; + sum += getMatrixAt(matrix1, k, j) * getMatrixAt(matrix2, j, k); } - matrix_erg.buffer [i * erg_cols + j] = sum; + setMatrixAt(sum, matrix_erg, i, j); } } return matrix_erg; } - else - { - - matrix_erg.rows = 0; - matrix_erg.cols = 0; - matrix_erg.buffer = NULL; - return matrix_erg; - } + } \ No newline at end of file