C++中的多维数据集:从 std::vector 的 2D 数据到 std::vector 的 2D 网格的最干净方法?

Multi-dimensional datasets in C++: cleanest approach to go from a std::vector of 2D data, to a 2D grid of std::vectors?

本文关键字:std 2D vector 网格 方法 数据 C++ 数据集      更新时间:2023-10-16

上下文:我一直在处理科学卫星图像,目前将每个时间戳的单个最终结果保留为cv::Mat_<double>,例如可以存储在图像的 std::容器中,例如std::vector<cv::Mat_<double>>

问题:我现在想研究每个像素随时间推移的物理特性。为此,如果我能沿时间维度查看数据并使用 2D 矢量表,那将是可取的。换句话说:将一个std::vector<double>关联到所有图像通用的 2D 网格上的每个像素。

其中一个原因是计算类型(计算百分位数、曲线拟合等(将依赖于期望提供std::vectors等的std::algorithms和库。对于给定的像素,数据在时间维度上的内存中绝对不是连续的。

在这种情况下,我真的可以/应该避免复制数据吗?如果是,那么最好的方法是什么?最好的我的意思是高效但尽可能"干净"/"清晰"。

我想到了std::reference_wrapper将地址存储在std::vector中;它简单且有效,但每个条目占用的内存与我简单地在std::vector<double>中复制数据一样多。毕竟,每个数据点都只是双倍。

铌: 我偶然发现了Boost MultiArray,但我想避免添加Boost依赖项。

提前感谢您的时间/投入。

你可以尝试类似std::views::transform的东西(或者它是前身,范围v3和增强范围适配器(,使用函数对象来查找每个像素

[x, y](cv::Mat_<double> & mat) -> double & { return mat[y][x]; }

但是,您绝对应该分析这是否值得与复制,因为我希望缓存位置很糟糕。