dlib中矩阵乘法结果无法赋值给预先定义动态dlib::matrix的问题排查
问题根因
该报错和代码逻辑本身无关,本质是MinGW GCC 9.2.0的模板两阶段查找规则与dlib矩阵模块实现的兼容性问题:
- 矩阵加法的代码执行路径不会触发对内部
op_pointer_to_col_vect类型的依赖,因此将结果赋值给已定义的动态尺寸矩阵时,可以正常编译运行 - 矩阵乘法的执行路径会在赋值运算符的模板推导分支中,引用尚未完成前置定义的
op_pointer_to_col_vect类型,触发不完整类型的编译报错 - 声明矩阵时同步通过乘法结果初始化的写法可以正常运行,是因为构造函数的表达式处理分支没有走赋值运算符的推导路径,没有触发上述类型依赖
支持已定义矩阵直接接收乘法结果的可行方案
- 显式实体化乘法表达式后赋值
通过dlib自带的dlib::mat()接口对乘法结果做立即求值,绕开赋值运算符内部的模板推导分支,修改后的可运行代码示例:
该写法完全不改变原有计算逻辑,能直接将乘法结果赋值给预先定义的动态尺寸矩阵对象,从根源避开编译报错。dlib::matrix<double, 2, 2> a; dlib::matrix<double, 2, 2> b; dlib::matrix<double> rez; a = 1.0, 1.0, 1.0, 1.0; b = 3.0, 3.0, 3.0, 3.0; // 原触发报错的写法:rez = a*b; // 修改后可正常运行的写法 rez = dlib::mat(a * b); - 调整编译器兼容参数
如果不想修改原有代码逻辑,可以在VS Code的MinGW编译配置中追加-fpermissive编译参数,放宽GCC模板实例化阶段的严格检查规则,允许延后查找嵌套的内部类型定义,保留rez = a*b的原有写法即可正常编译。
注意:不建议通过手动遍历矩阵元素、逐值拷贝的方式赋值,会破坏dlib矩阵内置的表达式优化逻辑,无意义拉低运算效率。
内容的提问来源于stack exchange,提问作者Allan Rääk
相关产品推荐
相关产品推荐

