2017-01-12 13 views
1

たとえば、次のようなデータを簡単にコピーできます。例えばEigen::VectorXdstd::vector<double>またはstd::vector<Eigen::Vector3d>は、std :: vectorからEigen :: Refを作成する

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

また、マトリックスブロック/列からEigen::Ref<VectorXd>を作成/ ...

のような例が可能である(例えば https://stackoverflow.com/a/26094708/4069571または https://stackoverflow.com/a/21560121/4069571を参照してください)
MatrixXd mat(10,10); 
Eigen::Ref<VectorXd> vec = mat.col(0); 

質問

std::vector<double>またはstd::vector<Eigen::Vector3d>から最初にデータをコピーすることなくEigen::Ref<VectorXd>を作成することはできますか?

+1

デフォルトでは、Ref は、連続したメモリレイアウトを持つfloatの任意の高密度ベクトル表現を参照できます。* 'std :: vector 'を' Eigen :: Map'する必要があるかもしれません 'で始まり、次に' Ref'としてラップします。私は常にテンプレート関数を使い、 'Ref'は非テンプレート関数を対象としています。だから、試していないが、動作する必要があります。 refドキュメントへのリンク: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回目の編集後にもう少し精巧にしました。今私はEigen::Ref(ありがとう)の私のGoogleユニットテストを持っています。お役に立てれば。

+0

単体テストのおかげで非常に明確で、ありがとう。 最後に、私は 'Eigen :: Ref x'や' Eigen :: Ref :: Eigen :: VectorXd x = Eigen :: Map ::(...) 'の代わりに' Eigen :: VectorXd x =マップ x' – GPMueller

関連する問題