如何在Eigen数组或矩阵中实现类似std::vector push_back的追加操作?
用Eigen库实现std::vector push_back的等价功能
Eigen库本身没有提供和std::vector::push_back完全一致的成员函数,但可以通过动态调整向量尺寸并保留已有数据的方式实现等价效果,核心是使用conservativeResize方法。
下面是对应你给出的std::vector代码的Eigen实现:
#include <Eigen/Dense> #include <iostream> #include <cstdlib> int main() { // Eigen动态整数向量,对应std::vector<int> Eigen::VectorXi index; // 初始化为空向量 index.resize(0); int random = 1 + (rand() % 5); // 逐个追加元素,等价于push_back for (int i = 0; i < random; ++i) { // 保守调整尺寸:保留现有元素,将向量长度+1 index.conservativeResize(index.size() + 1); // 给新扩展的位置赋值 index(index.size() - 1) = i + i; } // 遍历输出所有元素 for (int i = 0; i < index.size(); ++i) { std::cout << "ind = " << index(i) << std::endl; } return 0; }
关键说明:
Eigen::VectorXi是Eigen专为动态大小整数向量设计的类型,功能上对应std::vector<int>;如果需要其他数值类型,可以用VectorXd(双精度)、VectorXf(单精度)等。conservativeResize是实现"追加"的核心:它会保留向量中已有的所有元素,仅扩展(或缩小)向量的尺寸,这和push_back的行为完全匹配。如果用普通的resize,原有数据可能会被覆盖。- Eigen中访问向量元素推荐用
index(i)的形式,不过也支持index[i]的数组式访问。
如果提前知道最终元素数量,也可以直接一次性调整向量尺寸再赋值,效率会更高:
// 提前分配足够空间,避免多次调整尺寸 index.resize(random); for (int i = 0; i < random; ++i) { index(i) = i + i; }
内容的提问来源于stack exchange,提问作者Bruno
相关产品推荐
相关产品推荐

