Eigen库c++代码的报错

定义了

Eigen::MatrixXf normal_1,normal_2;
double slope_angle=(abs(normal_1*normal_2))/((normal_1*normal_1)*(normal_2*normal_2));

编译后
报错

error: no matching function for call to 'abs(const Eigen::Product<Eigen::Matrix<float,-1,-1>,Eigen::Matrix<float,-1,-1>,0>)'

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
根据错误信息,可以看到编译器无法找到匹配的 abs 函数。这是因为 abs 函数的参数类型不是 Eigen::Product 类型,而是标准 C++ 内置类型,例如 intfloatdouble 等。

在你的代码中,abs 函数的参数是 abs(normal_1*normal_2),这个表达式的类型是 Eigen::Product<Eigen::Matrix<float,-1,-1>,Eigen::Matrix<float,-1,-1>,0>,它是两个 Eigen::Matrix 类型的矩阵乘积,而不是标准 C++ 内置类型。

要解决这个问题,可以考虑使用 Eigen 库提供的数学函数来计算矩阵的绝对值。例如,可以使用 norm() 函数来计算矩阵的 Frobenius 范数,然后再取绝对值。下面是一个示例代码:

Eigen::MatrixXf normal_1, normal_2;
double norm_product = (normal_1 * normal_2).norm();
double slope_angle = std::abs(norm_product) / ((normal_1 * normal_1).norm() * (normal_2 * normal_2).norm());

在这个示例中,我们使用了 norm() 函数来计算矩阵的 Frobenius 范数,然后再使用标准 C++ 库提供的 abs() 函数来计算绝对值。

希望这个解决方案可以帮助你解决问题。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

  • 你可以参考下这篇文章:Eigen C++非线性最小二乘法代码实现
  • 除此之外, 这篇博客: Eigen——c++矩阵库使用入门实践中的 Eigen模块及头文件 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

  • 数值运算的需求是多种多样的。Eigen为这些不同的需求进行分类,并以头文件的形式进行区分。

    这样用户只需要包含应用需要的头文件即可。

    总结如下:

    在这里插入图片描述