为什么 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;
}
我正在尝试计算 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;
}