2017-01-26 21 views
2

class TestにはTest :: _ aにマップされるEigen :: Matrixがあります。 これは、std :: vectorを変更するたびに、ベクトルと行列の両方が同じチャンクを使用してデータを保持するため、Eigen :: Matrixもすぐに変更を反映することを意味します。std :: vector属性にマップするEigen :: matrix属性を持つクラスを持つ

これは動作します:

#include <Eigen/Dense> 
#include <vector> 
int main() { 
    std::vector<int> a; 
    a.resize(10); 
    typedef Eigen::Matrix<int, 1, Eigen::Dynamic> mat_type; 
    Eigen::Map<mat_type> a_eigen(a.data(), a.size()); 
} 

しかし、これは動作しません....

#include <Eigen/Dense> 
#include <vector> 
class Test { 
public: 
    Test(int size) { 
     _a.resize(size); 
     _a_eigen(_a.data(), size); 
    } 
    std::vector<int> _a; 
    Eigen::Map< Eigen::Matrix<int, 1, Eigen::Dynamic> > _a_eigen; 
}; 
int main() { 
    Test t(10); 
} 

あなたが必要とCOUTのプリントが何

#include <Eigen/Dense> 
#include <vector> 
#include <iostream> 
class Test { 
public: 
    typedef Eigen::Matrix<int, 1, Eigen::Dynamic> mat_type; 
    Test(int size) { 
     _a.resize(size); 
     Eigen::Map<mat_type>(_a_eigen) = Eigen::Map<mat_type>(_a.data(), size); 
     for (int i = 0; i < size; ++i) _a[i] = i; 
    } 
    std::vector<int> _a; 
    mat_type _a_eigen; 
}; 
int main() { 
    Test t(10); 
    std::cout << t._a_eigen; 
} 
+0

私は何の理由もなくdownvotedのように見えます。 –

答えて

4

ためにも動作しません下クラスのコンストラクタの初期化子リストのMapを初期化する:

#include <Eigen/Core> 
#include <vector> 
class Test { 
public: 
    Test(int size) : _a(size), _a_eigen(_a.data(), size) { } 
    std::vector<int> _a; 
    Eigen::Map< Eigen::Matrix<int, 1, Eigen::Dynamic> > _a_eigen; 
}; 
+0

Woot!答え!しかし、ちょうど質問に。コンストラクタがstd :: vectorのサイズを変更し、_a.data()によって返されるポインタを変更する可能性がありますか? –

+0

ああ。私は今これを得る。この場合は問題ありません。ありがとう。 –

+0

'Eigen :: Map'のポインタを(潜在的に)無効にするので、' std :: vector'のサイズを変更することはできません。 (本当に必要な場合は、placement-newを使って 'Map'を再起動する可能性があります:http://eigen.tuxfamily.org/dox/classEigen_1_1Map.html) – chtz

関連する問題