diff --git a/src/typed-geometry/types/mat.hh b/src/typed-geometry/types/mat.hh
index ff81e540b0243f523bbfcc8e772c7cde043a29fc..3e07caea57aac63ffb237e62bc28dddc3de950ee 100644
--- a/src/typed-geometry/types/mat.hh
+++ b/src/typed-geometry/types/mat.hh
@@ -1,6 +1,9 @@
 #pragma once
 
+#include <initializer_list>
+
 #include <typed-geometry/types/scalars/default.hh>
+#include <typed-geometry/types/span.hh>
 #include "vec.hh"
 
 #include <typed-geometry/feature/assert.hh>
@@ -277,6 +280,16 @@ public:
             m.set_row(3, vec<C, ScalarT>::from_data(data + C * 3));
         return m;
     }
+    static constexpr mat from_data_rowwise(span<ScalarT const> data)
+    {
+        TG_ASSERT(data.size() == C * R && "wrong amount of data");
+        return mat::from_data_rowwise(data.data());
+    }
+    static constexpr mat from_data_rowwise(std::initializer_list<ScalarT> data)
+    {
+        TG_ASSERT(data.size() == C * R && "wrong amount of data");
+        return mat::from_data_rowwise(data.begin());
+    }
     /// creates a matrix from contiguous memory, treating the data as col-by-col
     static constexpr mat from_data_colwise(ScalarT const* data)
     {
@@ -290,6 +303,16 @@ public:
             m[3] = vec<R, ScalarT>::from_data(data + R * 3);
         return m;
     }
+    static constexpr mat from_data_colwise(span<ScalarT const> data)
+    {
+        TG_ASSERT(data.size() == C * R && "wrong amount of data");
+        return mat::from_data_rowwise(data.data());
+    }
+    static constexpr mat from_data_colwise(std::initializer_list<ScalarT> data)
+    {
+        TG_ASSERT(data.size() == C * R && "wrong amount of data");
+        return mat::from_data_rowwise(data.begin());
+    }
 
     template <class... Args>
     static constexpr mat from_cols(Args const&... args)