From b780a32d53e718328ab496c37cbb2710254da6d2 Mon Sep 17 00:00:00 2001 From: Jasper Date: Mon, 1 Sep 2025 09:42:02 +0200 Subject: Added functions to swap rows and cols --- matrix.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ matrix.h | 4 ++++ 2 files changed, 54 insertions(+) diff --git a/matrix.c b/matrix.c index 4bcbf88..c04b91b 100644 --- a/matrix.c +++ b/matrix.c @@ -121,6 +121,56 @@ Matrix *matrix_copy (const Matrix *mat) return tmp; } +Matrix *matrix_swap_rows(const Matrix *mat, size_t i, size_t j) +{ + Matrix *tmp = matrix_copy(mat); + + for (size_t k = 0; k < mat->n; ++k) + { + matrix_at(tmp, i, k) = matrix_at(mat, j, k); + matrix_at(tmp, j, k) = matrix_at(mat, i, k); + } + + return tmp; +} + +void matrix_swap_rows1(Matrix *mat, size_t i, size_t j) +{ + double tmp; + + for (size_t k = 0; k < mat->n; ++k) + { + tmp = matrix_at(mat, i, k); + matrix_at(mat, i, k) = matrix_at(mat, j, k); + matrix_at(mat, j, k) = tmp; + } +} + +Matrix *matrix_swap_cols(const Matrix *mat, size_t i, size_t j) +{ + Matrix *tmp = matrix_copy(mat); + + for (size_t k = 0; k < mat->m; ++k) + { + matrix_at(tmp, k, i) = matrix_at(mat, k, j); + matrix_at(tmp, k, j) = matrix_at(mat, k, i); + } + + return tmp; +} + +void matrix_swap_cols1(const Matrix *mat, size_t i, size_t j) +{ + double x; + + for (size_t k = 0; k < mat->m; ++k) + { + x = matrix_at(mat, k, i); + matrix_at(mat, k, i) = matrix_at(mat, k, j); + matrix_at(mat, k, j) = x; + } +} + double matrix_trace(const Matrix *mat) { assert(matrix_is_square(mat) && "Trace is not defined for non-square matrices"); diff --git a/matrix.h b/matrix.h index 7c5da78..63f1441 100644 --- a/matrix.h +++ b/matrix.h @@ -32,6 +32,10 @@ char *matrix_to_str(const Matrix *mat); Matrix *matrix_id(size_t n); Matrix *matrix_const(size_t m, size_t n, double x); Matrix *matrix_copy (const Matrix *mat); +Matrix *matrix_swap_rows(const Matrix *mat, size_t i, size_t j); +void matrix_swap_rows1(Matrix *mat, size_t i, size_t j); +Matrix *matrix_swap_cols(const Matrix *mat, size_t i, size_t j); +void matrix_swap_cols1(const Matrix *mat, size_t i, size_t j); double matrix_trace(const Matrix *mat); Matrix *matrix_transpose(const Matrix *mat); Matrix *matrix_add(const Matrix *A, const Matrix *B); -- cgit v1.2.3