Create Eigen::Ref from std::vector

Create Eigen::Ref from std::vector

本文关键字:std vector from Ref Eigen Create      更新时间:2023-10-16

很容易在例如 例如Eigen::VectorXdstd::vector<double>std::vector<Eigen::Vector3d>

std::vector<Eigen::Vector3> vec1(10, {0,0,0});
Eigen::VectorXd vec2(30);
VectorXd::Map(&vec2[0], vec1.size()) = vec1;

(例如参见 https://stackoverflow.com/a/26094708/4069571 或 https://stackoverflow.com/a/21560121/4069571)

此外,Eigen::Ref<VectorXd>可以从矩阵块/列/...例如像

MatrixXd mat(10,10);
Eigen::Ref<VectorXd> vec = mat.col(0);

问题

是否可以在不先复制数据的情况下从std::vector<double>甚至std::vector<Eigen::Vector3d>创建Eigen::Ref<VectorXd>

我尝试过,它实际上就像我在评论中描述的那样工作,首先映射,然后将其包装为Eigen::Ref对象。这里通过谷歌测试显示。

void processVector(Eigen::Ref<Eigen::VectorXd> refVec) {
  size_t size = refVec.size();
  ASSERT_TRUE(10 == size);
  std::cout << "Sum before change: " << refVec.sum(); // output is 50 = 10 * 5.0
  refVec(0) = 10.0; // for a sum of 55
  std::cout << "Sum after change: " << refVec.sum() << std::endl;
}
TEST(testEigenRef, onStdVector) {
  std::vector<double> v10(10, 5.0);
  Eigen::Map<Eigen::VectorXd> mPtr(&v10[0], 10);
  processVector(mPtr);
  // confirm that no copy is made and std::vector is changed as well
  std::cout << "Std vec[0]: " << v10[0] << std::endl; // output is 10.0
}

在第二次编辑后使其更加精致。现在我有我的谷歌单元测试Eigen::Ref(谢谢)。希望这有帮助。