diff --git a/main.c b/main.c
index a86789a69be35328a11eadf44da1eb41bc7d7286..2ddb2daccc7f078853ad037c429fb8410294a162 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 fb71f567634e33886e08f8581a866dacc1fe90ac..c477170f24fc2ef9544f1996f655d06d31e45405 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;
+}