как отобразить Eigen :: Matrix в std :: vector? - PullRequest
0 голосов
/ 14 февраля 2019

Например, если у меня есть Eigen::MatrixXd размером 10 столбцов и 3 строки, как я могу связать это с std::vector из 10 элементов Eigen::Vector3d?когда я говорю псевдоним, я имею в виду использование одного и того же блока памяти без копирования.

Я знаю, что могу сделать обратное отображение, например:

std::vector<Vector3d> v(10);
...
Map<Matrix<double,3,Dynamic> >  m(v.data().data(), 3, 10);

, но, наоборот, если у меня есть Eigen:: Matrix, я пытался преобразовать его в вектор Eigen :: vector, но следующая строка кода не удалась компиляции

Eigen::Matrix2Xd points;
...
std::vector<Eigen::Vector2d> v_points(points.data()
    Eigen::aligned_allocator<Eigen::vector2d>(points_data()))

1 Ответ

0 голосов
/ 14 февраля 2019

Это возможно с помощью пользовательского распределителя, как описано там: Можно ли инициализировать std :: vector поверх уже выделенной памяти?

Для этого вам придется переосмыслитьэто как Vector3d*:

Vector3d* buf = reinterpret_cast<Vector3d*>(mat.data());

, а затем передать его в свой пользовательский распределитель:

std::vector<Vector3d, PreAllocator<Vector3d>> my_vec(10, PreAllocator<Vector3d>(buf, 10));

Другой вариант - заключить его в некоторые представления std::vector, напримерgsl::span:

gsl::span<Vector3d> view(buf,mat.cols());

В обоих случаях объект mat должен оставаться живым в течение всего жизненного цикла std::vector или span.

. Для полноты можно такжеглубоко скопируйте его в std::vector:

std::vector<Vector3d> v(10);
Matrix<double,3,Dynamic>::Map(v.data().data(),3,10) = mat;
...