首页 > 解决方案 > 具有 2 个分量数组的特征映射到 3 个向量

问题描述

我有一个std::array<double, 2>元素向量。我需要将其转换Eigen::Vector3d为使用库,并且我想知道是否有任何方法可以使用 Eigen::Map 与我的向量交互。如果我的向量是 std::array<double, 3>` 我可以做类似的事情

        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;
}

最后一个snipper需要复制内存和复制。如果可以使用某种映射,则可以减少内存消耗并提高性能。

据我所知,Eigen::Map 允许使用一个Stride类来提供一些步幅,但它们基本上以字节为单位表示一行中的下一个元素,而以字节为单位表示一列中的下一个元素。没有办法指定更复杂的东西,比如读取 2 个连续的双精度然后是 0。

标签: c++eigen

解决方案


可能您可以如下所述转换为 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


推荐阅读