为什么 Eigen 的 diagonal().row() 上的 std:sqrt 会因 "no instance of overloaded function matches argument list" 而失败

Why does std:sqrt on Eigen's diagonal().row() fail with "no instance of overloaded function matches argument list"

我正在尝试计算 Eigen::Matrix3d 的 .diagonal() 的每个元素的平方根。使用

std::sqrt(matrix.diagonal().row(i))

会给我一个编译错误:

no instance of overloaded function "std::sqrt" matches the argument list -- argument types are: (Eigen::Block<Eigen::Diagonal<Eigen::Matrix<double, 3, 3, 0, 3, 3>, 0>, 1, 1, false>)C/C++(304)

我在 for 循环中使用 .row() 来访问对角向量的每一行。 .diagonal() 向量的每个元素都应为双精度类型。

我正在使用指针取消引用 - 但是当我只打印 .row() 时它起作用了。

我猜问题出在 sqrt 和 .row() 的返回值中。我做错了什么?

编辑:.diagonal().array().sqrt() 可以解决问题。

因为matrix.diagonal().row(n)的结果类型是一个一个的矩阵。您可以使用 .value() 成员函数将其转换为平面类型:

#include <iostream>
#include <Eigen/Dense>

int main()
{
    Eigen::Matrix3f m;
    m << 1, 2, 3,
         4, 5, 6,
         7, 8, 9;

    std::cout << std::sqrt( m.diagonal().row(1).value() ) << "\n";

    return 0;
}