分段方形的矢量,C ++ Eigen中两个向量的分段产品

时间:2015-12-19 18:01:39

标签: c++11 vector eigen square piecewise

va是具有n维的Eigen::VectorXd向量时,我想进行以下分段操作:

  • va的分段乘法,即向量(a[1]*v[1], ..., a[n]*v[n])
  • v的分段方格,即向量(v[1]*v[1], ..., v[n]*v[n])

Eigen是否为上述操作提供了方法,还是需要手动实现?当然很简单,但我希望它们尽可能快地运行。

2 个答案:

答案 0 :(得分:5)

为了处理诸如你的问题之类的元素操作,Eigen提供了Array类。因此,要执行您询问的操作,您可以将逐点产品编写为:

c = a.array() * v.array(); // Long version
c = a.cwiseProduct(v);     // Short(er) version

和你所拥有的广场:

s = v.array().square();    // Probably what you want to use
s = v.array().abs2();      // Two operations: abs() then square()
s = v.cwiseAbs2();         // Same as above

使用VectorXd作为数组不会产生副本,因此非常有效。

答案 1 :(得分:1)

好吧,如果你得到第一个,第二个就是a=v的特殊情况。

执行第一个操作的最简单方法是从a创建对角矩阵并执行正常产品。

查看docs,您可以使用a.asDiagonal()

关于效率,如果你希望它尽可能快,那么这可能不是你想要的'。在这种情况下,您应该根据循环和向量构造对此进行测量,以确定是否存在任何实际差异。