2015-12-19 16 views
0

诚然,vaEigen::VectorXd矢量具有N维的,我想作以下分段操作:分段正方形,在C++征两个向量的分段产物

  • v的分段乘以a,即,矢量(a[1]*v[1], ..., a[n]*v[n]),和
  • v的分段方形,即,矢量(v[1]*v[1], ..., v[n]*v[n])

EigenEigen是否提供上述操作的方法,还是我需要手动实现它们?这当然很简单,但我希望他们尽可能快地跑。

回答

1

那么,如果你得到第一个去,第二个只是一个特定的情况下,a=v

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

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

关于效率,或许这不是你想要的,如果你希望它'尽可能快'。在这种情况下,你应该通过循环和向量构造来衡量它,看看你是否有任何实际的区别。

+0

我明白了,谢谢!我试图通过向量乘法来避免矩阵,因为我相信这会比向量乘以向量要慢。但可能我需要实现这两种方式并衡量执行时间。 – nullgeppetto

+1

我对Eigen内部不熟悉,但文档提到'asDiagonal'返回一个'DiagonalWrapper'而不是整个矩阵,甚至是一个新的对角矩阵本身。所以它可能非常有效。 – VillasV

+0

我会再试一次,再次感谢。我现在想要的是获得完整矩阵的对角线部分,我可以自己实现它,我认为没有类似的Eigen函数。 – nullgeppetto

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作为数组时,不会产生复制,所以它非常高效。