c++ - 在没有循环的情况下将函数应用于特征矩阵中的所有元素

标签 c++ eigen eigen3

我有一个 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。如果没有 Vanilla 循环,这可能吗?

最佳答案

您可以将 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 不会编译。

关于c++ - 在没有循环的情况下将函数应用于特征矩阵中的所有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50538239/

相关文章:

c++ - 最小二乘的 SparseQR

c++ - 将 vector 堆叠到特征矩阵中

c++ - 等价于 Matlab 的 sum(A)?

c++ - 在其定义中创建一个实例

c++ - 使用 Matio 在 C++ 中打开 3d matlab 文件

c++ - 处理异常 std::out_of_range C++

c++ - Eigen(c++) 中的 MatrixXd 和 VectorXd 定义在哪里?我无法通过 grep 命令找到它们的定义

c++ - 在 Eigen 中初始化矩阵

c++ - 对 Eigen block 的自动引用未按预期运行

c++ - ISO C++ 禁止比较指针和整数 [-fpermissive]