当v
,a
是具有n维的Eigen::VectorXd
向量时,我想进行以下分段操作:
v
与a
的分段乘法,即向量(a[1]*v[1], ..., a[n]*v[n])
和v
的分段方格,即向量(v[1]*v[1], ..., v[n]*v[n])
。 Eigen
是否为上述操作提供了方法,还是需要手动实现?当然很简单,但我希望它们尽可能快地运行。
答案 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()
。
关于效率,如果你希望它尽可能快,那么这可能不是你想要的'。在这种情况下,您应该根据循环和向量构造对此进行测量,以确定是否存在任何实际差异。