summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJasper2025-09-01 09:42:02 +0200
committerJasper2025-09-01 09:42:02 +0200
commitb780a32d53e718328ab496c37cbb2710254da6d2 (patch)
tree1463ad1c085b907899957e8b5330e351b761ad6a
parent093c1a4beb2d6c5f505dd97e81dc1a0b0bbba0d1 (diff)
Added functions to swap rows and cols
-rw-r--r--matrix.c50
-rw-r--r--matrix.h4
2 files changed, 54 insertions, 0 deletions
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);