C++ 中的多维数据集:从 std::vector 的二维数据到 std::vector 的二维网格的最简洁方法?

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

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

问题: 我现在想研究每个像素随时间变化的物理特性。为此,如果我可以沿时间维度查看数据并改为使用 2D table 向量,那将是更好的选择。换句话说:让 std::vector<double> 与二维网格上的每个像素相关联,这对所有图像都是通用的。

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

Can/Should 在这种情况下我真的避免复制数据吗? 如果是,那么最好的方法是什么?最好的意思是尽可能 'clean'/'clear' 高效。

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

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

非常感谢您的time/input。

您可以尝试 std::views::transform (or it's precursors, range-v3 and boost range adaptors),使用函数对象来查找每个像素

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

但是你应该明确分析这是否值得与复制相比,因为我预计缓存位置会很糟糕。