Собственная карта с массивом из 2 компонентов в вектор из 3 - PullRequest
0 голосов
/ 20 июня 2020

У меня есть вектор из std::array<double, 2> элементов. Мне нужно преобразовать это в Eigen::Vector3d, чтобы использовать библиотеку, и я хочу знать, есть ли способ использовать Eigen :: Map для взаимодействия с моим вектором. Если бы мой вектор был std :: array `Я мог бы сделать что-то вроде

        std::array<double, 3> dx;
        Eigen::Map<const Eigen::VectorXd> dx_eig(&dx_[0][0], 3 * dx.size());

, но мой вектор сделан из std::array<double, 2>, и я не могу напрямую использовать Eigen :: Map, насколько мне известно.

Я хочу что-то вроде этого:

std::vector<std::array<double, 2>> x;
Eigen::Map<Eigen::Vector3d> x_eig(x, ???)

так, что x_eig ведет себя как в следующем примере

std::vector<std::array<double, 2>> x;
Eigen::Vector3d x_eig(3*x.size());
for (int i = 0; i < x.size(); ++i)
{
    x_eig[3*i + 0] = x[i][0];
    x_eig[3*i + 1] = x[i][1];
    x_eig[3*i + 2] = 0;
}

Последний фрагмент требует дублирования памяти и копирования. Если можно использовать какую-то карту, можно было бы уменьшить потребление памяти и, возможно, повысить производительность.

Насколько мне известно, Eigen :: Map позволяет использовать класс Stride для предоставления некоторых шагов, но они в основном размер в байтах для следующего элемента в строке и размер в байтах для следующего элемента в столбце. Невозможно указать что-то гораздо более сложное, например, прочитать 2 последовательных двойных и затем 0.

1 Ответ

0 голосов
/ 20 июня 2020

Может быть, вы можете преобразовать в 3D, как сказано ниже, и передать вектор в Eigen::Map.

//YOUR ARRAY.
std::array<double,2> d2 = {1,2};

//CREATE A VECTOR.
std::vector<double> d3(std::begin(d2), std::end(d2);

//ADD THIRD ELEMENT.
d3.push_back(0);

Теперь передайте его в Eigen::Map

...