From bc4215edfd34590c8078b3bb459005807d36c5cf Mon Sep 17 00:00:00 2001 From: Jasper Date: Mon, 1 Sep 2025 20:10:12 +0200 Subject: Merge row-swap and col-swap --- matrix.c | 64 ++++++++++++++++++++++++++++++---------------------------------- matrix.h | 11 +++++++---- 2 files changed, 37 insertions(+), 38 deletions(-) diff --git a/matrix.c b/matrix.c index c04b91b..a784308 100644 --- a/matrix.c +++ b/matrix.c @@ -121,53 +121,49 @@ Matrix *matrix_copy (const Matrix *mat) return tmp; } -Matrix *matrix_swap_rows(const Matrix *mat, size_t i, size_t j) +Matrix *matrix_swap(const Matrix *mat, MatrixSwapType t, size_t i, size_t j) { Matrix *tmp = matrix_copy(mat); + size_t lim = (t == MATRIX_SWAP_ROWS ? mat->n : mat->m); - for (size_t k = 0; k < mat->n; ++k) + for (size_t k = 0; k < lim; ++k) { - matrix_at(tmp, i, k) = matrix_at(mat, j, k); - matrix_at(tmp, j, k) = matrix_at(mat, i, k); + switch (t) + { + case MATRIX_SWAP_ROWS: + matrix_at(tmp, i, k) = matrix_at(mat, j, k); + matrix_at(tmp, j, k) = matrix_at(mat, i, k); + break; + case MATRIX_SWAP_COLS: + matrix_at(tmp, k, i) = matrix_at(mat, k, j); + matrix_at(tmp, k, j) = matrix_at(mat, k, i); + break; + } } return tmp; } -void matrix_swap_rows1(Matrix *mat, size_t i, size_t j) +void matrix_swap1(Matrix *mat, MatrixSwapType t, size_t i, size_t j) { double tmp; + size_t lim = (t == MATRIX_SWAP_ROWS ? mat->n : mat->m); - 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) + for (size_t k = 0; k < lim; ++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; + switch (t) + { + case MATRIX_SWAP_ROWS: + tmp = matrix_at(mat, i, k); + matrix_at(mat, i, k) = matrix_at(mat, j, k); + matrix_at(mat, j, k) = tmp; + break; + case MATRIX_SWAP_COLS: + tmp = matrix_at(mat, k, i); + matrix_at(mat, k, i) = matrix_at(mat, k, j); + matrix_at(mat, k, j) = tmp; + break; + } } } diff --git a/matrix.h b/matrix.h index 63f1441..aa95771 100644 --- a/matrix.h +++ b/matrix.h @@ -16,6 +16,11 @@ typedef enum { MATRIX_NONE } MatrixType; +typedef enum { + MATRIX_SWAP_ROWS, + MATRIX_SWAP_COLS +} MatrixSwapType; + typedef struct { double *xs; size_t m; @@ -32,10 +37,8 @@ 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); +Matrix *matrix_swap(const Matrix *mat, MatrixSwapType t, size_t i, size_t j); +void matrix_swap1(Matrix *mat, MatrixSwapType t, 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