From 6a5aa9a8fce251fb7032d7688a7f0ff54278ba8a Mon Sep 17 00:00:00 2001
From: "dario.genga" <dario.genga@etu.hesge.ch>
Date: Mon, 22 Nov 2021 19:18:59 +0100
Subject: [PATCH] Add matrix initialization from array

---
 main.c   | 11 ++++++++++-
 matrix.c | 16 ++++++++++++++++
 2 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/main.c b/main.c
index 0a04670..fb6e61b 100644
--- a/main.c
+++ b/main.c
@@ -12,7 +12,16 @@
 
 int main() {
     matrix mat;
-    matrix_init(&mat, 3, 4, 0);
+    int32_t m = 3;
+    int32_t n = 4;
+    int32_t s = m * n;
+    int32_t val = 0;
+    int32_t data[12] = { 2, 1, -1, -2, 3, 1, 1, 3, 1, 4, -1, -1 };
+    matrix_init(&mat, m, n, val);
+    printf("Empty matrix %dx%d\n", m, n);
+    matrix_print(mat);
+    matrix_init_from_array(&mat, m, n, data, s);
+    printf("Matrix %dx%d from array\n", m, n);
     matrix_print(mat);
     
     return EXIT_SUCCESS;
diff --git a/matrix.c b/matrix.c
index a390d2d..9d8118f 100644
--- a/matrix.c
+++ b/matrix.c
@@ -49,6 +49,22 @@ error_code matrix_init(matrix *mat, int32_t m, int32_t n, int32_t val) {
     return ok;
 }
 
+error_code matrix_init_from_array(matrix *mat, int32_t m, int32_t n, int32_t data[], int32_t s) {
+    if (m <= 0 || n <= 0 || m * n != s) {
+        return err;
+    }
+
+    matrix_alloc(mat, m, n);
+
+    for (int i = 0; i < m; i++) {
+        for (int k = 0; k < n; k++) {
+            mat->data[i][k] = data[k + (i * n)];
+        }
+    }
+
+    return ok;
+}
+
 error_code matrix_print(const matrix mat) {
     for (int i = 0; i < mat.m; i++) {
         printf("[");
-- 
GitLab