2017-01-12 3 views
1

Легко копировать данные между, например, Eigen::VectorXd и std::vector<double> или std::vector<Eigen::Vector3d>, напримерСоздать Eigen :: Ref из std :: vector

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); 

Вопрос

Возможно ли создать Eigen::Ref<VectorXd> от std::vector<double> или даже std::vector<Eigen::Vector3d> без предварительного копирования данных?

+1

В соответствии с документацией это должно быть возможно: * По умолчанию a Ref может ссылаться на любое плотное векторное выражение float, имеющее смежную макет памяти. * Возможно, вам придется «Eigen :: Map» 'std :: vector 'сначала, а затем заверните его как' Ref'. Я всегда использую функции шаблонов, а 'Ref' предназначен для не-шаблонных функций. Так что не пробовали, но должны работать. Ссылка на ref doc: http://eigen.tuxfamily.org/dox///classEigen_1_1Ref.html – NameRakes

ответ

3

Я пробовал, и он действительно работает, поскольку я описываю в своем комментарии сначала сопоставление, а затем обертываю его как объект 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 
} 

Сделал это немного более сложным после 2-го редактирования. Теперь у меня есть мой модульный тест Google для Eigen::Ref (спасибо). Надеюсь это поможет.

+0

Очень ясно, благодаря модульным тестам, спасибо. В конце концов, я копировал данные, потому что написал «Eigen :: VectorXd x = Eigen :: Map (...)» вместо 'Eigen :: Ref x' или' Eigen :: Карта x' – GPMueller

Смежные вопросы