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]; }
但是你应该明确分析这是否值得与复制相比,因为我预计缓存位置会很糟糕。
上下文:
我一直在处理科学卫星图像,目前将每个时间戳的单个最终结果保存为 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]; }
但是你应该明确分析这是否值得与复制相比,因为我预计缓存位置会很糟糕。