【问题标题】:Eigen map with array of 2 components to vector of 3具有 2 个分量数组的特征映射到 3 个向量
【发布时间】:2020-06-20 17:11:31
【问题描述】:

我有一个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&lt;double, 2&gt; 组成的,据我所知,我不能直接使用 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。

【问题讨论】:

  • 您能否提供一个minimal reproducible example,即您将如何手动执行您需要执行的操作。我不知道你想如何从std::vector&lt;std::array&lt;double,2&gt;&gt;2*n 元素)映射到 3 个元素。此外,在您提供的 sn-p 中,没有 dx_,只有 dx
  • Vector3d 正好包含 3 个元素。你想要Matrix3Xdperhaps 吗?之后你会做什么操作?

标签: c++ eigen


【解决方案1】:

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

【讨论】:

  • 我目前正在使用类似的东西。我没有创建向量,而是创建了 Eigen::Vector3d。我要求的解决方案并不意味着使用更多内存并浪费时间复制内存。
  • 我认为没有复制很难找到解决方案。如您所知,数组的大小是固定的。您或图书馆应该进行复制操作以使其从 2 变为 3(因为它是数组)。另一种选择是,如果它不是一个庞大的代码库,则到处都用向量替换数组。然后你将拥有所有的灵活性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-08
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
  • 1970-01-01
  • 2020-03-01
  • 2016-01-15
相关资源
最近更新 更多