diff --git a/Startcode/matrix.c b/Startcode/matrix.c index ad00628..04a312d 100644 --- a/Startcode/matrix.c +++ b/Startcode/matrix.c @@ -6,30 +6,100 @@ Matrix createMatrix(unsigned int rows, unsigned int cols) { - + if(rows == 0 || cols == 0){ + return (Matrix) {0, 0, NULL}; // Compound struct, kann für c99 verwendet werden + } + MatrixType *arr = malloc(rows * cols * sizeof(MatrixType)); + Matrix new_matrix = {rows, cols, arr}; + return new_matrix; } void clearMatrix(Matrix *matrix) { - + free(matrix->buffer); + matrix->buffer = NULL; + matrix->rows = 0; + matrix->cols = 0; } void setMatrixAt(MatrixType value, Matrix matrix, unsigned int rowIdx, unsigned int colIdx) { - + if(rowIdx < matrix.rows && colIdx < matrix.cols){ + *(matrix.buffer + rowIdx * matrix.rows + colIdx) = value; + } } MatrixType getMatrixAt(const Matrix matrix, unsigned int rowIdx, unsigned int colIdx) { - + if(rowIdx >= matrix.rows || colIdx >= matrix.cols){ + return 0; + } + return *(matrix.buffer + rowIdx * matrix.rows + colIdx); } Matrix add(const Matrix matrix1, const Matrix matrix2) { + int n1 = matrix1.cols; + int m1 = matrix1.rows; + int n2 = matrix2.cols; + int m2 = matrix2.cols; + + if(n1 == 1 && m1 == m2){ + Matrix new_mat = createMatrix(m2, n2); + for(int i = 0; i < m2; i++){ + for(int j = 0; j < n2; j++){ + *(new_mat.buffer + i * n2 + j) = *(matrix2.buffer + i * n2 + j) + *(matrix1.buffer + i); + } + } + return new_mat; + } + if(n2 == 1 && m1 == m2){ + Matrix new_mat = createMatrix(m1, n1); + for(int i = 0; i < m1; i++){ + for(int j = 0; j < n1; j++){ + *(new_mat.buffer + i * n1 + j) = *(matrix1.buffer + i * n1 + j) + *(matrix2.buffer + i); + } + } + return new_mat; + } + + if(n1 != n2 || m1 != m2){ + return (Matrix) {0, 0, NULL}; + } + + Matrix new_mat = createMatrix(n1, m1); + + for(int i = 0; i < m1; i++){ + for(int j = 0; j < n1; j++){ + *(new_mat.buffer + i * n1 + j) = *(matrix1.buffer + i * n1 + j) + *(matrix2.buffer + i * n1 + j); + } + } + return new_mat; } Matrix multiply(const Matrix matrix1, const Matrix matrix2) { - + int m = matrix1.rows; + int q = matrix1.cols; + int l = matrix2.cols; + + if(q != matrix2.rows){ + return (Matrix) {0, 0, NULL}; + } + + Matrix new_matrix = createMatrix(m, l); + MatrixType *new_mat_arr = new_matrix.buffer; + + for(int i = 0; i < m; i++){ + for(int j = 0; j < l; j++){ + int sum = 0; + for(int k = 0; k < q; k++){ + sum += *(matrix1.buffer + i * q + k) * *(matrix2.buffer + k * l + j); + } + *(new_mat_arr + i * l + j) = sum; + } + } + + return new_matrix; } \ No newline at end of file diff --git a/Startcode/matrix.h b/Startcode/matrix.h index cc640d1..e751efc 100644 --- a/Startcode/matrix.h +++ b/Startcode/matrix.h @@ -7,6 +7,12 @@ typedef float MatrixType; // TODO Matrixtyp definieren +typedef struct { + int rows; + int cols; + MatrixType *buffer; +} Matrix; + Matrix createMatrix(unsigned int rows, unsigned int cols); void clearMatrix(Matrix *matrix); diff --git a/Startcode/runMatrixTests b/Startcode/runMatrixTests new file mode 100755 index 0000000..9de5604 Binary files /dev/null and b/Startcode/runMatrixTests differ