2017-01-26 5 views
2

Я хочу, чтобы class Test имел Eigen :: Matrix, который сопоставляется с Test :: _ a. Это означает, что всякий раз, когда я изменяю std :: vector, Eigen :: Matrix также сразу отражает изменение, поскольку и вектор, и матрица используют один и тот же кусок памяти для хранения данных.Имейте класс с атрибутом Eigen :: matrix, который сопоставляется с атрибутом std :: vector

Это работает:

#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

выглядит так, как будто я получил нисходящее направление. –

ответ

4

Вам нужно для инициализации карты в списке инициализаторов конструктора вашего класса:

#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

После этого вы не можете изменить размер 'std :: vector', так как это (потенциально) аннулирует указатель в' Eigen :: Map'. (Существует возможность перезапустить «Карту» с использованием нового места размещения, если вам действительно нужно: http://eigen.tuxfamily.org/dox/classEigen_1_1Map.html) – chtz