我正在使用 Eigen 3.4。我想减去两个长度不等的向量,在底部用零填充较短的向量,同时避免重新分配内存。粗略的例子:
VectorXd A (4), B (2);
A << 1, 2, 3, 4;
B << 5, 6;
VectorXd C = paddedSubtract(A, B); // computes A - B but pads B with zeros to match A
结果应该是
C = [-4, -4, 3, 4]
请注意,我事先并不知道这两个向量中哪一个会更短。
conservativeResize
将两个向量的大小调整为两个向量中较大者的大小,然后手动将填充值设置为零。然而,这需要对尺寸进行一些检查,这很好,但我想知道是否有更干净的方法。conservativeResizeLike
,传入一个具有较大向量大小的零向量,但我担心的是,会在后台不必要地分配临时零向量;性能很重要,因为此操作将执行多次(但在小向量上)。我的两个问题是:
谢谢。
我认为零向量会有额外的内存分配是正确的吗
是的。您可以创建自己的填充运算符,但是,它可能会击败 Eigen 的显式矢量化,因为它在循环中引入了一个条件。这与没有连接运算符的原因相同。请参阅 Eigen 中返回表达式的向量串联
是否有比(1)或(3)更干净/更特征化的方法?
保持简单:
Eigen::Index maxSize = std::max(A.size(), B.size());
Eigen::Index minSize = std::min(A.size(), B.size());
Eigen::Index tailSize = maxSize - minSize;
Eigen::VectorXd C(maxSize);
C.head(minSize) = A.head(minSize) - B.head(minSize);
if(A.size() == maxSize)
C.tail(tailSize) = A.tail(tailSize);
else
C.tail(tailSize) = -B.tail(tailSize);
这将被优化以避免冗余内存操作。如果您想要更少的线路且效率稍低:
Eigen::VectorXd C = Eigen::VectorXd::Zero(std::max(A.size(), B.size());
C.head(A.size()) = A;
C.head(B.size()) -= B;