Многомерные наборы данных в C ++: самый чистый подход к go от std :: vector 2D-данных до 2D-сетки std :: vectors? - PullRequest
0 голосов
/ 27 мая 2020

Контекст: Я обрабатывал научные c спутниковые изображения, в настоящее время сохраняя индивидуальные конечные результаты на каждой временной метке как cv::Mat_<double>, которые, например, могут храниться в std :: container изображения, такие как std::vector<cv::Mat_<double>>.

Проблема: Теперь я хотел бы изучить физические свойства каждого отдельного пикселя с течением времени. Для этого было бы гораздо предпочтительнее, если бы я мог смотреть на данные по временному измерению и вместо этого работать с 2D-таблицей векторов. Другими словами: иметь std::vector<double>, связанный с каждым пикселем в 2D-сетке, общей для всех изображений.

Причина в том, что тип вычислений (вычисление процентилей, аппроксимация кривой и т. Д. c) будет полагаться на std::algorithms и библиотеки, которые ожидают, что будут загружены std::vectors и т.п. Однако для данного пикселя данные определенно не являются непрерывными в памяти по временному измерению.

Могу ли я / должен ли я действительно избегать копирования данных в таком случае? Если да, то что будет тогда лучший подход? Под наилучшим я подразумеваю эффективный, но как можно более «чистый» / «чистый».

Я подумал о std::reference_wrapper для хранения адресов в std::vector; это просто и работает, но каждая запись занимает столько памяти, как если бы я просто скопировал данные в std::vector<double>. В конце концов, каждая точка данных - это всего лишь двойник.

NB: Я наткнулся на Boost MultiArray, но мне бы не хотелось добавлять зависимость Boost.

Заранее большое спасибо на ваше время / вклад.

1 Ответ

1 голос
/ 28 мая 2020

Вы можете попробовать что-то вроде std::views::transform (или его предшественники, range-v3 и адаптеры диапазона повышения ), с функциональными объектами для поиска каждого пикселя

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

Однако вы обязательно должны профилировать, стоит ли это копировать, так как я ожидаю, что расположение кеша будет ужасным.

...