Инициализировать Eigen::MatrixXd из 2d std::vector

Надеюсь, это должно быть довольно просто, но я не могу найти способ сделать это в документации Eigen.

Скажем, у меня есть 2D-вектор, т.е.

std::vector<std::vector<double> > data

Предположим, что он заполнен 10 x 4 набором данных.

Как я могу использовать эти данные для заполнения формы Eigen::MatrixXd mat.

Очевидный способ - использовать цикл for следующим образом:

#Pseudo code
Eigen::MatrixXd mat(10, 4);
for i : 1 -> 10
   mat(i, 0) = data[i][0];
   mat(i, 1) = data[i][1];
   ...
 end

Но должен ли быть лучший способ, родной для Eigen?


person Fantastic Mr Fox    schedule 16.09.2013    source источник


Ответы (1)


Конечно вещь. Вы не можете сделать всю матрицу сразу, потому что vector<vector> хранит отдельные строки в непрерывной памяти, но последовательные строки могут не быть смежными. Но вам не нужно назначать все элементы строки:

std::vector<std::vector<double> > data;
MatrixXd mat(10, 4);
for (int i = 0; i < 10; i++)
  mat.row(i) = VectorXd::Map(&data[i][0],data[i].size());
person us2012    schedule 17.09.2013
comment
Хорошо, так что это уменьшает проблему на единицу, можете ли вы сделать более сложную карту по внешнему вектору? - person Fantastic Mr Fox; 17.09.2013
comment
@ Бен Не из <vector<vector>>. Вы могли бы, если бы у вас была матрица в непрерывном блоке памяти в порядке строк или столбцов. - person us2012; 17.09.2013