summaryrefslogtreecommitdiff
path: root/matrix.c
diff options
context:
space:
mode:
authorJasper2025-09-12 11:40:15 +0200
committerJasper2025-09-12 11:40:15 +0200
commita6f4ecafb9aeb94bab65d0256d8d69ab0ed024b0 (patch)
treee03dd325c73e080efbca60a44838489955a5d856 /matrix.c
parent1e8fe2e6058b8ae243dfd0d71de67d17ac67b2b0 (diff)
Matrix transpose doesn't edit memory representation
- transpose swaps dimensions - transpose sets variable to indicate it has been transposed - matrix_at acts accordingly - matrix_foreach_idx now uses matrix_at to set the iterator to allow iterating over a transposed matrix
Diffstat (limited to 'matrix.c')
-rw-r--r--matrix.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/matrix.c b/matrix.c
index 646be42..222ad6d 100644
--- a/matrix.c
+++ b/matrix.c
@@ -20,6 +20,7 @@ Matrix *matrix_alloc(size_t m, size_t n)
mat->xs = xs;
mat->m = m;
mat->n = n;
+ mat->T = false;
return mat;
}
@@ -196,14 +197,19 @@ double matrix_trace(const Matrix *mat)
Matrix *matrix_transpose(const Matrix *mat)
{
- assert(mat != NULL && "Matrix points to null");
- assert(mat->xs != NULL && "Matrix elements point to null");
-
- Matrix *T = matrix_alloc(mat->n, mat->m);
- matrix_foreach_idx(T, t, i, j) *t = matrix_at(mat, j, i);
+ Matrix *T = matrix_copy(mat);
+ matrix_transpose1(T);
return T;
}
+void matrix_transpose1(Matrix *mat)
+{
+ size_t m = mat->m;
+ mat->m = mat->n;
+ mat->n = m;
+ mat->T = !mat->T;
+}
+
Matrix *matrix_add(const Matrix *A, const Matrix *B)
{
assert(A->m == B->m && A->n == B->n && "Dimension mismatch");