Eigen Block模板参数Row为1时赋值给Ref的编译错误解决方法
Eigen中1行Block无法绑定到Eigen::Ref的编译错误解决方案
问题重现
以下代码尝试将1行的Block绑定到Eigen::Ref时会触发编译错误:
Eigen::Matrix<float, 5, Dynamic> m(5, 5); auto r = m.topRows<1>(); Eigen::Ref<Eigen::Matrix<float, 1, Dynamic>> r2(r);
编译错误信息:
error: no matching function for call to ‘Eigen::Ref<Eigen::Matrix<float, 1, -1> >::Ref(Eigen::Block<Eigen::Matrix<float, 5, -1>, 1, -1, false>&)’ 46 | Eigen::Ref<Eigen::Matrix<float, 1, Dynamic>> r2(r);
但当topRows的行数指定为2或更多时,代码可正常编译:
Eigen::Matrix<float, 5, Dynamic> m(5, 5); auto r = m.topRows<2>(); Eigen::Ref<Eigen::Matrix<float, 2, Dynamic>> r2(r);
原因分析
Eigen对Block模板做了特殊特化:当模板参数中RowsAtCompileTime=1时,该Block会被特化为行向量兼容类型(本质是Eigen::Block的行向量特化版本),而你声明的Eigen::Ref<Eigen::Matrix<float,1,Dynamic>>是1行普通矩阵类型,两者的表达式类型不匹配,导致Ref的构造函数无法找到合适的重载。
规避方法
方法1:将Ref类型改为行向量类型
直接使用行向量的别名或显式行向量模板定义,匹配Block的特化类型:
Eigen::Matrix<float, 5, Dynamic> m(5, 5); auto r = m.topRows<1>(); // 使用行向量别名 Eigen::Ref<Eigen::RowVectorXf> r2(r); // 或显式指定行向量的模板参数 Eigen::Ref<Eigen::Matrix<float, 1, Dynamic, Eigen::RowMajor>> r2(r);
方法2:显式转换为矩阵表达式
调用.matrix()方法将特化的行向量Block转换为普通矩阵表达式,即可匹配Ref的矩阵类型:
Eigen::Matrix<float, 5, Dynamic> m(5, 5); auto r = m.topRows<1>(); Eigen::Ref<Eigen::Matrix<float, 1, Dynamic>> r2(r.matrix());
方法3:指定Block的具体类型(不推荐)
避免auto推导,直接声明普通矩阵类型的Block,不过这种写法冗余,仅作参考:
Eigen::Matrix<float, 5, Dynamic> m(5, 5); Eigen::Block<Eigen::Matrix<float,5,Dynamic>,1,Dynamic,false> r = m.topRows<1>(); Eigen::Ref<Eigen::Matrix<float,1,Dynamic>> r2(r);
内容的提问来源于stack exchange,提问作者Khan
相关产品推荐
相关产品推荐

