Применить функцию ко всем элементам в Eigen Matrix без цикла - PullRequest
0 голосов
/ 26 мая 2018

У меня есть Eigen :: Matrix, и я хотел бы создать новую матрицу, в которой все ее элементы генерируются вызовом некоторой функции для элементов матрицы:

Matrix< Foo,2,2 > m = ...;
Matrix< int, 2, 2> new_m;

for each m[i][j]:
  new_m[i][j] = m[i][j].member_of_foo_returns_int()

Я посмотрелна Eigen :: unaryExpr, но элементы изменились, и возврат должен быть таким же.Тем не менее, у меня есть объекты Foo в первой матрице, а int возвращается в новой матрице.Это возможно без ванильной петли?

1 Ответ

0 голосов
/ 27 мая 2018

Вы можете передать лямбда-выражение unaryExpr, например, так:

Eigen::Matrix<int,2,2> new_m = m.unaryExpr(
    [](const Foo& x) {
        return x.member_of_foo_returns_int();
    });

Если вы не можете использовать c ++ 11, вам нужно написать небольшую вспомогательную функцию:

int func_wrapper(const Foo& x) {
    return x.member_of_foo_returns_int();
}

и передайте это, используя std::ptr_fun:

Eigen::Matrix<int,2,2> new_m = m.unaryExpr(std::ptr_fun(func_wrapper));

Для вызова функций-членов на самом деле уже реализована хорошая вспомогательная функция с именем std::mem_fun_ref (она принимает указатель на функцию-член и возвращает функторобъект, который принимается unaryExpr):

Eigen::Matrix<int,2,2> new_m = m.unaryExpr(
    std::mem_fun_ref(&Foo::member_of_foo_returns_int));

Все эти варианты являются типобезопасными, т. е. попытка сохранить результат в не-1017 * -Matrix не скомпилируется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...