From a6f4ecafb9aeb94bab65d0256d8d69ab0ed024b0 Mon Sep 17 00:00:00 2001 From: Jasper Date: Fri, 12 Sep 2025 11:40:15 +0200 Subject: 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 --- matrix.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) (limited to 'matrix.c') 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"); -- cgit v1.2.3