Eigen 怎么判断 Eigen::Vector3d 里面有无效值 c++ 代码
时间: 2024-04-01 21:38:27 浏览: 21
判断 Eigen::Vector3d 是否存在无效值,可以使用 Eigen::Vector3d 的 allFinite() 方法。该方法会返回一个 bool 类型的值,如果 Eigen::Vector3d 所有元素都是有效的(即不是 NaN 或 Inf),则返回 true,否则返回 false。
示例代码:
```c++
Eigen::Vector3d v = Eigen::Vector3d::UnitX();
v(1) = std::numeric_limits<double>::quiet_NaN(); // 设置一个 NaN 值
if (v.allFinite()) {
std::cout << "v 中所有元素都是有效值" << std::endl;
} else {
std::cout << "v 中存在无效值" << std::endl;
}
```
在上面的示例中,我们首先创建了一个 Eigen::Vector3d 类型的变量 v,然后将它的第二个元素设置为 NaN。最后通过调用 v.allFinite() 方法来判断 v 中是否存在无效值。由于 v 中存在 NaN 值,因此该方法会返回 false。
相关问题
帮我写一段c++代码,给std::vector<Eigen::Vector3d>输入数值
当然可以,以下是一个示例代码,它将向一个`std::vector`中添加三个3D向量:
```
#include <iostream>
#include <vector>
#include <Eigen/Dense>
int main()
{
std::vector<Eigen::Vector3d> vec;
Eigen::Vector3d v1(1.0, 2.0, 3.0);
Eigen::Vector3d v2(4.0, 5.0, 6.0);
Eigen::Vector3d v3(7.0, 8.0, 9.0);
vec.push_back(v1);
vec.push_back(v2);
vec.push_back(v3);
std::cout << "The vector contains " << vec.size() << " elements:\n";
for (std::vector<Eigen::Vector3d>::iterator it = vec.begin(); it != vec.end(); ++it)
std::cout << *it << '\n';
return 0;
}
```
在这个例子中,我们使用了Eigen库中的`Vector3d`类型来表示3D向量,并将它们添加到一个`std::vector`中。我们使用了`push_back`函数来添加向量,使用`size`函数来获取向量的数量,并使用一个循环来打印向量。
cv::Mat和eigen::vector3d的转换
将cv::Mat转换为eigen::Vector3d:
```c++
cv::Mat mat(3, 1, CV_64F); // 3行1列的64位浮点型矩阵
mat.at<double>(0,0) = 1.0;
mat.at<double>(1,0) = 2.0;
mat.at<double>(2,0) = 3.0;
Eigen::Vector3d vec;
cv::cv2eigen(mat, vec);
```
将eigen::Vector3d转换为cv::Mat:
```c++
Eigen::Vector3d vec(1.0, 2.0, 3.0);
cv::Mat mat = cv::Mat::zeros(3, 1, CV_64F);
cv::eigen2cv(vec, mat);
```
需要注意的是,这里的cv::Mat和Eigen::Vector3d的数据类型都是双精度浮点型(CV_64F),如果需要其他数据类型的转换,需要相应地修改代码。