C++11 向量的分段平方,C+中两个向量的分段乘积+;本征

C++11 向量的分段平方,C+中两个向量的分段乘积+;本征,c++11,vector,eigen,square,piecewise,C++11,Vector,Eigen,Square,Piecewise,假设v,a是Eigen::VectorXdn维向量,我想进行以下分段操作: v与a的分段乘法,即向量(a[1]*v[1],…,a[n]*v[n]),和 v的分段平方,即向量(v[1]*v[1],…,v[n]*v[n]) Eigen是否为上述操作提供了方法,或者我需要手动实现它们?当然有非常简单的,但我希望它们运行得尽可能快。编辑: 好吧,如果你让第一个开始,第二个只是一个特殊情况,其中a=v 执行第一个操作的最简单方法是从a创建一个对角矩阵,然后执行一个普通乘积 查看,您可以使用a.asDi

假设
v
a
Eigen::VectorXd
n维向量,我想进行以下分段操作:

  • v
    a
    的分段乘法,即向量
    (a[1]*v[1],…,a[n]*v[n])
    ,和
  • v
    的分段平方,即向量
    (v[1]*v[1],…,v[n]*v[n])
Eigen
是否为上述操作提供了方法,或者我需要手动实现它们?当然有非常简单的,但我希望它们运行得尽可能快。

编辑:

好吧,如果你让第一个开始,第二个只是一个特殊情况,其中
a=v

执行第一个操作的最简单方法是从
a
创建一个对角矩阵,然后执行一个普通乘积

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

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

编辑:

好吧,如果你让第一个开始,第二个只是一个特殊情况,其中
a=v

执行第一个操作的最简单方法是从
a
创建一个对角矩阵,然后执行一个普通乘积

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


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

对于处理元素操作(如您的问题),Eigen提供了类。因此,要执行您所询问的操作,您可以将逐点产品编写为:

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
作为数组不会产生副本,因此非常有效。

对于处理元素操作(如问题),Eigen提供了类。因此,要执行您所询问的操作,您可以将逐点产品编写为:

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
作为数组不会产生副本,因此非常有效。

我明白了,谢谢!我试图避免逐向量矩阵乘法,因为我相信这会比逐向量矩阵乘法慢。但我可能需要实现这两种方法并测量执行时间。我不熟悉Eigen的内部结构,但文档中提到,
asDiagonal
返回一个
DiagonalWrapper
,而不是一个完整的矩阵,甚至是一个新的对角矩阵本身。所以这可能是相当有效的。我会试试看,再次感谢。我现在想要的是得到一个完整矩阵的对角部分,我可以自己实现它,我认为没有类似的本征函数。我明白了,谢谢!我试图避免逐向量矩阵乘法,因为我相信这会比逐向量矩阵乘法慢。但我可能需要实现这两种方法并测量执行时间。我不熟悉Eigen的内部结构,但文档中提到,
asDiagonal
返回一个
DiagonalWrapper
,而不是一个完整的矩阵,甚至是一个新的对角矩阵本身。所以这可能是相当有效的。我会试试看,再次感谢。我现在想要的是得到一个完整矩阵的对角部分,我可以自己实现它,我认为没有类似的本征函数。