diff options
author | Jasper | 2025-09-12 11:40:15 +0200 |
---|---|---|
committer | Jasper | 2025-09-12 11:40:15 +0200 |
commit | a6f4ecafb9aeb94bab65d0256d8d69ab0ed024b0 (patch) | |
tree | e03dd325c73e080efbca60a44838489955a5d856 /matrix.c | |
parent | 1e8fe2e6058b8ae243dfd0d71de67d17ac67b2b0 (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.c | 16 |
1 files changed, 11 insertions, 5 deletions
@@ -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"); |