diff --git a/matrix.c b/matrix.c index ad00628..964aa0c 100644 --- a/matrix.c +++ b/matrix.c @@ -6,30 +6,166 @@ Matrix createMatrix(unsigned int rows, unsigned int cols) { + Matrix matrix; + + + matrix.rows = rows; + matrix.cols = cols; + + + if (rows == 0 || cols == 0) { + matrix.data = NULL; + return matrix; + } + + + matrix.data = (MatrixType*) malloc(rows * cols * sizeof(MatrixType)); + + + if (matrix.data == NULL) { + + matrix.rows = 0; + matrix.cols = 0; + return matrix; + } + + + for (unsigned int i = 0; i < rows * cols; i++) { + matrix.data[i] = 0; + } + + return matrix; } void clearMatrix(Matrix *matrix) { - + if (matrix->data == NULL) { + return; + } + + + free(matrix->data); + + + matrix->data = 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) { + + return; + } + + + unsigned int index = rowIdx * matrix.cols + colIdx; + + + matrix.data[index] = value; } MatrixType getMatrixAt(const Matrix matrix, unsigned int rowIdx, unsigned int colIdx) { - + + if (rowIdx >= matrix.rows || colIdx >= matrix.cols) { + + return 0; + } + + + unsigned int index = rowIdx * matrix.cols + colIdx; + + + return matrix.data[index]; } Matrix add(const Matrix matrix1, const Matrix matrix2) { - + Matrix result; + + + if (matrix1.rows != matrix2.rows || matrix1.cols != matrix2.cols || + matrix1.data == NULL || matrix2.data == NULL) { + + result.rows = 0; + result.cols = 0; + result.data = NULL; + return result; + } + + + result = createMatrix(matrix1.rows, matrix1.cols); + + + if (result.data == NULL) { + return result; + } + + + unsigned int totalElements = matrix1.rows * matrix1.cols; + + for (unsigned int i = 0; i < totalElements; i++) { + result.data[i] = matrix1.data[i] + matrix2.data[i]; + } + + return result; } Matrix multiply(const Matrix matrix1, const Matrix matrix2) { - + Matrix result; + + + if (matrix1.data == NULL || matrix2.data == NULL || + matrix1.rows == 0 || matrix1.cols == 0 || + matrix2.rows == 0 || matrix2.cols == 0) { + + result.rows = 0; + result.cols = 0; + result.data = NULL; + return result; + } + + + if (matrix1.cols != matrix2.rows) { + + result.rows = 0; + result.cols = 0; + result.data = NULL; + return result; + } + + + result = createMatrix(matrix1.rows, matrix2.cols); + + if (result.data == NULL) { + return result; + } + + + for (unsigned int i = 0; i < matrix1.rows; i++) { + for (unsigned int j = 0; j < matrix2.cols; j++) { + MatrixType sum = 0; + + for (unsigned int k = 0; k < matrix1.cols; k++) { + + unsigned int index1 = i * matrix1.cols + k; + + + unsigned int index2 = k * matrix2.cols + j; + + sum += matrix1.data[index1] * matrix2.data[index2]; + } + + + unsigned int indexResult = i * result.cols + j; + result.data[indexResult] = sum; + } + } + + return result; } \ No newline at end of file