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

问题描述 投票:0回答:1

上下文。我一直在处理科学卫星图像,目前将每个时间戳的单个最终结果保存为... 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。

c++ multidimensional-array c++14 std stdvector
1个回答
1
投票

你可以尝试一些像 std::views::transform (或它的前身。范围-v3增程适配器),用函数对象来查找每个像素。

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

然而你一定要配置文件,如果这值得与复制,因为我预计缓存的位置性是可怕的。

© www.soinside.com 2019 - 2024. All rights reserved.