如何无需普通循环实现Eigen矩阵元素的跨类型函数转换?
当然可以用
unaryExpr实现,你之前的理解有误! 别担心,Eigen::unaryExpr完全支持输入和输出元素类型不同的转换——这其实就是它设计的核心场景之一,专门用来替代手动循环做元素级别的类型映射或转换。
两种实现方式,任你选:
1. 用Lambda表达式(最简洁,适合一次性使用)
直接在unaryExpr里传入一个lambda,把每个Foo对象转换成int:
#include <Eigen/Core> struct Foo { int member_of_foo_returns_int() const { // 这里是你的实际逻辑,比如返回某个成员变量 return some_int_member; } }; int main() { Eigen::Matrix<Foo, 2, 2> m; // 先初始化m的各个元素... // 一行代码完成转换 Eigen::Matrix<int, 2, 2> new_m = m.unaryExpr([](const Foo& foo) { return foo.member_of_foo_returns_int(); }); return 0; }
2. 用自定义函数对象(适合需要复用转换逻辑的场景)
如果这个Foo转int的逻辑需要在多个地方使用,可以定义一个函数对象(functor):
// 定义转换函数对象 struct FooToIntConverter { int operator()(const Foo& foo) const { return foo.member_of_foo_returns_int(); } }; // 使用时 Eigen::Matrix<int, 2, 2> new_m = m.unaryExpr(FooToIntConverter());
小提醒:
- 确保
member_of_foo_returns_int()是const成员函数(如果你的lambda/functor里用的是const Foo&参数),这样才能安全调用;如果你的函数需要修改Foo对象,把参数改成Foo&即可,但一般不建议这么做。 - Eigen的
unaryExpr内部会做优化,效率和手写循环持平甚至更高,完全不用担心性能问题。
内容的提问来源于stack exchange,提问作者AspiringMat
相关产品推荐
相关产品推荐

