Идея состоит в том, чтобы присвоить значения из std::vector блоку в Eigen::MatrixXd.
Мой вопрос в том, что это хороший способ сделать?
1 1 1 1 1 1
1 1 1 to 1 102 123
1 1 1 1 1 1
Я попытался преобразовать std::vector в Eigen::Map, но безуспешно. У меня есть рабочий код [следующий фрагмент], но он не очень нравится. Возможно, есть более простой способ?
void do_work(Eigen::MatrixXd &m, const std::vector<double> &v,
const Index i, const Index j,
const Index p, const Index q) {
auto stop = j + q;
for (Index start = j, idx = 0; start < stop; ++start, ++idx)
m.block(i, start, p, 1) << v[idx];
}
Eigen::MatrixXd m(3, 3);
m << 1, 1, 1, 1, 1, 1, 1, 1, 1;
std::vector<double> v = {102, 123};
Index change_row = 0;
Index change_column_from = 1, change_column_to = v.size();
do_work(m, v, change_row, change_column_from, 1, change_column_to);
Ожидаемым результатом будет выполнение операции эффективным (и, возможно, более чистым) способом.
Чтобы преобразовать std::vector<double>
в Eigen::Map
, напишите, например.
Eigen::Map<Eigen::VectorXd> map(v.data(), v.size());
для доступа для чтения и записи или следующее, если у вас есть доступ только для чтения к вашему вектору:
Eigen::Map<const Eigen::VectorXd> map(v.data(), v.size());
Это может быть назначено блочному выражению, при условии, что размер блока соответствует размеру карты:
m.block(i,j, map.size(), 1) = map.transpose();
// transpose is actually optional here