上下文。我一直在处理科学卫星图像,目前将每个时间戳的单个最终结果保存为... cv::Mat_<double>
,例如,它可以存储在一个图像的std::容器中,例如一个 std::vector<cv::Mat_<double>>
.
这个问题。我现在想研究每个像素随时间变化的物理特性。为此,如果我能够沿着时间维度看数据,并使用二维向量表来代替,那将是非常可取的。换句话说:要有一个 std::vector<double>
与二维网格上的每个像素相关联,是所有图像所共有的。
一个原因是,计算类型(计算百分比、曲线拟合等)将依赖于 std::algorithms
的图书馆,以及希望得到 std::vectors
等。不过对于一个给定的像素来说,数据在内存中沿时间维度肯定是不连续的。
在这种情况下,我真的应该避免复制数据吗? 如果是,那么最好的方法是什么?我所说的最佳方法是指高效而又尽可能的 "干净""清晰"。
我想过 std::reference_wrapper
将地址存储在一个 std::vector
;这很简单,也很有效,但每一次输入都会占用很多内存,就像我简单地将数据复制到一个新的系统中一样。std::vector<double>
. 每个数据点毕竟只是一个双数。
NB:我偶然发现了Boost MultiArray,但我想避免添加Boost依赖。
非常感谢你的timeinput。
你可以尝试一些像 std::views::transform
(或它的前身。范围-v3 和 增程适配器),用函数对象来查找每个像素。
[x, y](cv::Mat_<double> & mat) -> double & { return mat[y][x]; }
然而你一定要配置文件,如果这值得与复制,因为我预计缓存的位置性是可怕的。