Ubuntu下Eigen编译静态断言失败数值类型不匹配问题求助
解决方案
第一步:彻底清理编译缓存(优先解决修改/删除代码仍报错的问题)
- 执行
make clean删除Makefile定义的所有编译产物 - 手动删除当前目录及子目录下所有
.o后缀的目标文件 - 如果你使用了ccache编译缓存,执行
ccache -C清空全局缓存 - 删除构建目录(如果使用了独立build目录,直接删除整个build文件夹后重新创建)
第二步:修复Eigen类型不匹配问题
Eigen静态断言触发的核心是矩阵运算过程中存在隐式类型转换,你之前的写法存在两个未覆盖的类型提升场景:
- 两个
uint8_t类型的Eigen矩阵做乘法运算时,返回值会被C++隐式提升为int类型,即使操作数已经做了cast<t_binary>处理,最终乘法结果类型依然不是t_binary unaryExpr中lambda表达式的返回值存在隐式类型提升:uint8_t类型做%2算术运算时会被自动提升为int,导致返回值类型和目标矩阵类型不匹配
修复后的正确代码如下:
// 乘法操作完成后额外显式cast为t_binary,消除运算过程的隐式类型提升 *pt_calculatedSindrome = (sparseParityCheckMatrix.cast<t_binary>() * pt_receivedData->cast<t_binary>()).cast<t_binary>(); // lambda显式指定返回值类型为t_binary,同时强制转换运算结果避免类型提升 *pt_calculatedSindrome = pt_calculatedSindrome->unaryExpr([](const t_binary x) -> t_binary { return static_cast<t_binary>(x % 2); });
第三步:额外校验项
- 确认
sparseParityCheckMatrix、*pt_receivedData、*pt_calculatedSindrome三个变量的模板类型参数严格匹配,没有出现一个是稀疏矩阵一个是稠密矩阵的混用场景 - 如果清理缓存后报错行号发生变化,根据新的行号定位对应代码,排查其他存在隐式类型转换的矩阵运算
内容的提问来源于stack exchange,提问作者Zeinab Rahmani
相关产品推荐
相关产品推荐

