Eigen:减去两个长度不等的向量,隐式用零填充较短的向量

问题描述 投票:0回答:1

我正在使用 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]

请注意,我事先并不知道这两个向量中哪一个会更短。

  1. 我可以使用
    conservativeResize
    将两个向量的大小调整为两个向量中较大者的大小,然后手动将填充值设置为零。然而,这需要对尺寸进行一些检查,这很好,但我想知道是否有更干净的方法。
  2. 我可以使用
    conservativeResizeLike
    ,传入一个具有较大向量大小的零向量,但我担心的是,会在后台不必要地分配临时零向量;性能很重要,因为此操作将执行多次(但在小向量上)。
  3. 我可以只使用循环,但我仍然会遇到 (1) 的不雅观。

我的两个问题是:

  • 在上面的第(2)点中,我认为零向量会有额外的内存分配是否正确,或者由于编译时模板魔术而不是这种情况?
  • 如果确实存在不必要的内存分配,那么是否有比(1)或(3)更干净/更特征的方法?

谢谢。

c++ vector eigen eigen3
1个回答
0
投票

我认为零向量会有额外的内存分配是正确的吗

是的。您可以创建自己的填充运算符,但是,它可能会击败 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;
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.