向量的分段平方,C++ Eigen 中两个向量的分段乘积
Piece-wise square of vector, piece-wise product of two vectors in C++ Eigen
假定 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
创建对角矩阵并进行正态乘积。
看一下docs,可以用a.asDiagonal()
。
关于效率,如果你想要它,也许这不是你想要的'as fast as possible'。在那种情况下,您应该根据循环和矢量构造来衡量它,看看对您来说是否有任何实际差异。
为了处理诸如您的问题之类的元素明智的操作,Eigen 提供了 Array
class。因此,要执行您询问的操作,您可以将逐点乘积写为:
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
作为数组不会产生复制,所以效率很高。
假定 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
创建对角矩阵并进行正态乘积。
看一下docs,可以用a.asDiagonal()
。
关于效率,如果你想要它,也许这不是你想要的'as fast as possible'。在那种情况下,您应该根据循环和矢量构造来衡量它,看看对您来说是否有任何实际差异。
为了处理诸如您的问题之类的元素明智的操作,Eigen 提供了 Array
class。因此,要执行您询问的操作,您可以将逐点乘积写为:
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
作为数组不会产生复制,所以效率很高。