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
,而不是一个完整的矩阵,甚至是一个新的对角矩阵本身。所以这可能是相当有效的。我会试试看,再次感谢。我现在想要的是得到一个完整矩阵的对角部分,我可以自己实现它,我认为没有类似的本征函数。