在没有循环的情况下将函数应用于特征矩阵中的所有元素
Apply function to all elements in Eigen Matrix without loop
我有一个 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,但元素发生了变化,return 必须相同。但是,我在第一个矩阵中有 Foo 对象,在新矩阵中有一个 int returned。如果没有香草循环,这可能吗?
您可以将 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
(这需要一个成员函数指针和 returns 一个被 unaryExpr
接受的仿函数对象) :
Eigen::Matrix<int,2,2> new_m = m.unaryExpr(
std::mem_fun_ref(&Foo::member_of_foo_returns_int));
所有这些变体都是类型安全的,即试图将结果存储在非int
矩阵中将不会编译。
我有一个 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,但元素发生了变化,return 必须相同。但是,我在第一个矩阵中有 Foo 对象,在新矩阵中有一个 int returned。如果没有香草循环,这可能吗?
您可以将 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
(这需要一个成员函数指针和 returns 一个被 unaryExpr
接受的仿函数对象) :
Eigen::Matrix<int,2,2> new_m = m.unaryExpr(
std::mem_fun_ref(&Foo::member_of_foo_returns_int));
所有这些变体都是类型安全的,即试图将结果存储在非int
矩阵中将不会编译。