1

假设是具有 n 维v的向量,我想进行以下分段操作:aEigen::VectorXd

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

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

4

2 回答 2

7

为了处理诸如您的问题之类的元素明智的操作,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

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

于 2015-12-19T19:25:24.340 回答
0

编辑:Avi 的回答绝对是一个更好的解决方案

好吧,如果你得到第一个,第二个只是一个特例,其中a=v.

进行第一个操作的最简单方法是创建对角矩阵a并进行正常乘积。

看看文档,您可以使用a.asDiagonal().

关于效率,如果您希望它“尽可能快”,也许这不是您想要的。在这种情况下,您应该根据循环和向量构造来衡量这一点,看看是否对您有任何实际差异。

于 2015-12-19T18:08:14.560 回答