Eigen 3.3.x: как lamba-оперировать во всех рядах? - PullRequest
0 голосов
/ 04 февраля 2020

Предположим, у меня есть следующее l oop:

struct Obj {
   RowVectorXf payload;
   Obj(RowvectorXf payload) : payload(std::move(payload)) {};
}

MatrixXd data = ...

std::vector<Obj> payloads;
for (int i = 0; i < n; i++) {
  payloads.emplace_back(data.row(i)(seq(1,10,2));
}

Это упрощение моего варианта использования, которому абсолютно необходимо выйти в пространство std:: с struct, содержащим кусочек для здравомыслия и простоты кодирования. Во всяком случае, я начал использовать unaryExpr с нуля, и мне любопытно, есть ли что-то вроде rowExpr, которое могло бы выполнять эту функцию без for l oop (и, таким образом, устранять визуальный шум).

// Goal, in pseudo code: 
data.rowExpr([](RowVectorXd row) payloads.emplace_back(row(seq(1,10,2));

1 Ответ

2 голосов
/ 08 февраля 2020

В ветви разработки Eigen (и в следующей версии 3.4) вы можете получить доступ к элементам объектов Eigen с помощью std -совместимых итераторов. Чтобы выполнить итерацию по строкам в Eigen-выражении, вам нужно написать data.rowwise().begin() и data.rowwise().end() - (для итерации по столбцам необходимо написать .colwise().begin(), конечно). И вы можете напрямую передать их конструктору std::vector (если типы совместимы).

Так как в вашем примере вам также нужно преобразовать между double и float, вы можете написать что-то вроде этого :

auto const& data_ = data.cast<float>().rowwise();
std::vector<Obj> payloads(data_.begin(), data_.end());

Полный рабочий пример: https://godbolt.org/z/2x2jFJ

...