преобразовать собственную матрицу в форму std :: vector <std :: array <>> - PullRequest
0 голосов
/ 23 марта 2019

Как я могу преобразовать собственную матрицу в std::vector<std::array<>> форму?Предположим, у меня есть собственная матрица Eigen::MatrixXd A(4,3).Можно ли преобразовать матрицу A в std::vector<std::array<double,3>> форму?

1 Ответ

4 голосов
/ 23 марта 2019

Вы можете отобразить память std::vector<std::array<double,3>> на доступный для записи собственный тип, используя Eigen::Map, например,

// typedef for brevity, if you need this more often: 
typedef Eigen::Matrix<double, 4, 3, Eigen::RowMajor> Mat43dR;

std::vector<std::array<double,3>> raw_data;
raw_data.resize(4); // allocate memory for 4x3 entries
// Copy A to raw_data:
Mat43dR::Map(raw_data[0].data() ) = A;

Вы также можете читать из raw_data, используя Eigen::Map, конечно.И есть несколько альтернативных способов работы с Eigen::Map: https://eigen.tuxfamily.org/dox/group__TutorialMapClass.html

Добавление : если вы не знаете размер A во время компиляции, вы можете работатьс Dynamic размерами, такими как:

typedef Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> MatXXdR;
std::vector<std::array<double,3>> raw_data; // the `3` must still be known at compile-time
assert(A.cols()==3);
raw_data.resize(A.rows()); // allocate memory for Nx3 entries
// Copy A to raw_data:
MatXXdR::Map(raw_data[0].data(), A.rows(), A.cols() ) = A;
...