summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--matrix.c64
-rw-r--r--matrix.h11
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);