【问题标题】:Eigen Map class : mapping C-array to VectorXd pointer in an efficient wayEigen Map 类:以有效的方式将 C 数组映射到 VectorXd 指针
【发布时间】:2019-08-05 13:43:01
【问题描述】:

我需要将一个普通的双 C 数组转换为 VectorXd*。我发现 Map 类似乎可以完成这项工作,但有些东西我不明白。

class A {
  private:
    VectorXd *jpos_;
  public:
    int init( double *v, int len )
    {
      // Here I would like to assign v to jpos_ in an efficient way
      // (something like a pointer assignment without allocation or vector iterations)
      // Note that length of v is len
    }
};

我尝试了以下方法,但它不起作用:

int A::init( double *v, int len )
{
  jpos_ = &VectorXd::Map( v, len );
}

int A::init( double *v, int len )
{
  jpos_ = &Map<VectorXd>( v, len );
}

怎么了? 谢谢。

伊曼纽尔

【问题讨论】:

  • 为什么是 VectorXd* 而不是 VectorXd?
  • 如果你想使用 Eigen::Map 进行映射,你的成员变量应该是 Map 类型而不是 VectorXd。
  • 这只是一个例子:在实际代码中,我有一个 VectorXd*,我无法将其更改为 VectorXd
  • 如果要保留VectorXd*,需要复制。

标签: c++ eigen eigen3


【解决方案1】:

如果你想通过Eigen::Map映射一个数组,你的成员jpos_应该是Eigen::Map类型:

class A
{
private:
    Eigen::Map<Eigen::VectorXd> jpos_;

public:    
    A(double* v, int len) : jpos_ {v, len} {}
};

如果需要保留VectorXd,则需要将值复制到向量中。看到VectorXd* 有点奇怪。它类似于std::vector&lt;double&gt;*。我建议不要使用VectorXd*

class A
{
private:
    Eigen::VectorXd jpos_;

public:    
    A(double* v, int len) : jpos_ {v}
    {
        for (int i=0; i<len; ++i)
            jpos_(i) = v[i];
    }
};

编辑:

如果你真的需要VectorXd*,你可以用new分配一个(别忘了delete它)。

【讨论】:

  • 也许使用 Eigen::Map<:vectorxd> 作为 jpos_ 如果使用放置 new 将“指针”设置为不同的数组不涉及动态内存分配或向量迭代是可以接受的。这个想法是多次使用 init() 方法在程序执行过程中分配不同的向量,并使用 jpos_ 作为特殊算法的输入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
相关资源
最近更新 更多