将函数应用于Eigen Matrix中的所有元素,无需循环

问题描述 投票:1回答:1

我有一个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。这可能没有香草循环吗?

c++ eigen eigen3
1个回答
3
投票

您可以将lambda表达式传递给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));

所有这些变体都是类型安全的,即尝试将结果存储在非int-Matrix中将无法编译。

© www.soinside.com 2019 - 2024. All rights reserved.