summaryrefslogtreecommitdiff
path: root/matrix.c
diff options
context:
space:
mode:
Diffstat (limited to 'matrix.c')
-rw-r--r--matrix.c50
1 files changed, 50 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");