From 18a49919c88cb09a200a83bc875de554b09fddb5 Mon Sep 17 00:00:00 2001
From: "dario.genga" <dario.genga@etu.hesge.ch>
Date: Tue, 23 Nov 2021 00:32:29 +0100
Subject: [PATCH] Add sub matrix

---
 main.c   |  7 ++++++-
 matrix.c | 18 ++++++++++++++++++
 2 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/main.c b/main.c
index a86789a..2ddb2da 100644
--- a/main.c
+++ b/main.c
@@ -11,7 +11,7 @@
 #include "matrix.h"
 
 int main() {
-    matrix mat, cloned, transposed;
+    matrix mat, cloned, transposed, sub;
     int32_t m = 3;
     int32_t n = 4;
     int32_t s = m * n;
@@ -33,10 +33,15 @@ int main() {
     matrix_transpose(&transposed, mat);
     printf("Transposed matrix :\n");
     matrix_print(transposed);
+    // Sub matrix
+    matrix_extract_submatrix(&sub, transposed, 1, 4, 1, 3);
+    printf("Sub matrix :\n");
+    matrix_print(sub);
     // Free the memory
     matrix_destroy(&mat);
     matrix_destroy(&cloned);
     matrix_destroy(&transposed);
+    matrix_destroy(&sub);
 
     
     return EXIT_SUCCESS;
diff --git a/matrix.c b/matrix.c
index fb71f56..c477170 100644
--- a/matrix.c
+++ b/matrix.c
@@ -122,3 +122,21 @@ error_code matrix_transpose(matrix *transposed, const matrix mat) {
     return ok;
 }
 
+error_code matrix_extract_submatrix(matrix *sub, const matrix mat, int32_t m0, int32_t m1, int32_t n0, int32_t n1) {
+    if (m0 < 0 || m1 > mat.m || n0 < 0 || n1 > mat.n || m0 > m1 || n0 > n1) {
+        return err;
+    }
+
+    error_code code = matrix_alloc(sub, m1 - m0 , n1 - n0 );
+    if (code == err) {
+        return err;
+    }
+
+    for (int i = m0; i < m1; i++) {
+        for (int k = n0; k < n1; k++) {
+            sub->data[i - m0][k - n0] = mat.data[i][k];
+        }
+    }
+
+    return ok;
+}
-- 
GitLab