From b3f0f330801f612e23fea6d4c0e6cb90d42d785b Mon Sep 17 00:00:00 2001 From: "Joachim Wuttke (h)" <j.wuttke@fz-juelich.de> Date: Wed, 31 Jul 2024 12:05:19 +0200 Subject: [PATCH] + FieldUtil::make --- Base/Type/Field2D.h | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/Base/Type/Field2D.h b/Base/Type/Field2D.h index 185ad7f0ada..e4715072ea0 100644 --- a/Base/Type/Field2D.h +++ b/Base/Type/Field2D.h @@ -15,6 +15,7 @@ #ifndef BORNAGAIN_BASE_TYPE_FIELD2D_H #define BORNAGAIN_BASE_TYPE_FIELD2D_H +#include <functional> #include <heinz/Complex.h> #include <vector> @@ -25,24 +26,31 @@ using complex2d_t = Field2D<complex_t>; namespace FieldUtil { -template <typename C> std::vector<C> flatten(const Field2D<C>& src) +template <typename T> std::vector<T> flatten(const Field2D<T>& src) { - std::vector<C> result; + std::vector<T> result; for (const auto& row : src) result.insert(result.end(), row.begin(), row.end()); return result; } -template <typename C> Field2D<C> reshapeTo2D(const std::vector<C>& src, size_t n_rows) +template <typename T> +Field2D<T> make(size_t n_rows, size_t n_cols, std::function<T(size_t, size_t)> setter) { - size_t n_cols = src.size() / n_rows; - Field2D<C> result(n_rows); - + Field2D<T> result(n_rows, std::vector<T>(n_cols)); for (size_t i = 0; i < n_rows; i++) - result[i].insert(result[i].end(), src.begin() + i * n_cols, src.begin() + (i + 1) * n_cols); + for (size_t j = 0; j < n_cols; j++) + result[i][j] = setter(i, j); return result; } +template <typename T> Field2D<T> reshapeTo2D(const std::vector<T>& src, size_t n_rows) +{ + size_t n_cols = src.size() / n_rows; + return make<T>(n_rows, n_cols, + [&src, n_cols](size_t i, size_t j) -> T { return src[i * n_cols + j]; }); +} + } // namespace FieldUtil #endif // BORNAGAIN_BASE_TYPE_FIELD2D_H -- GitLab