У меня есть вектор из 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.