从 std::vector 创建 Eigen::Ref
Create Eigen::Ref from std::vector
很容易在例如之间复制数据。 Eigen::VectorXd
和 std::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;
(参见 or )
此外,可以从矩阵 block/column/... 创建 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
对象。此处通过 google 测试显示。
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
的 google 单元测试(谢谢)。希望这有帮助。
很容易在例如之间复制数据。 Eigen::VectorXd
和 std::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;
(参见 or )
此外,可以从矩阵 block/column/... 创建 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
对象。此处通过 google 测试显示。
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
的 google 单元测试(谢谢)。希望这有帮助。