Eigen isZero 但在每个矩阵元素上
Eigen isZero but on every matrix element
Eigen 中有一个非常有用的函数,称为 isFinite,它遍历矩阵,检查 NAN 和 INF 的适当值,并以这种方式使用:
#include <iostream>
#include <Eigen/Dense>
#include <vector>
#include <numeric>
namespace eig = Eigen;
int main() {
eig::MatrixXd e(2, 2);
e << 8.0, std::nan("1"), std::numeric_limits <double> ::infinity(), 4.0;
std::cout << e << std::endl;
e = (e.array().isFinite()).select(e, 0.0);
std::cout << e << std::endl;
return 0;
}
// Output:
//
// 8 nan
// inf 4
// 8 0
// 0 4
还有一个名为 isZero 的函数,但它仅应用于矩阵 returns 布尔值。我的问题是,是否有一个功能与 isFinite 功能相同,但检查值,例如零?
编辑:
谢谢,我选择了带有abs()的版本,但是有些事情让我感到困惑:当我执行以下操作时:
int main() {
eig::MatrixXd e_1(2, 2);
eig::MatrixXd e_2(2, 2);
e_1 << 8, 2, 3, 4;
e_2 << 1, 0, 0, 2;
e_1 = (e_2.array().abs() < 1.0E-10).select(e_1, 0.0);
std::cout << e_1 << std::endl;
}
// Output:
//
// 0 2
// 3 0
代码与我想的相反,它将 e_1 的条目更改为零,其中 e_2 不为零,所以我必须翻转小于登录到一个比标志大的地方。为什么会这样?
如果你想按元素检查零,你可以简单地写
(e.array()==0)
完整的工作示例:https://godbolt.org/z/CPBpNu
或者,在不更改数组域的情况下,您可以编写 (https://godbolt.org/z/R6v96R):
e.cwiseEqual(0)
注意检查浮点值是否相等时的常见注意事项。
要检查小数字,您可以这样写
(e.array().abs() < 1e-10)
Eigen 中有一个非常有用的函数,称为 isFinite,它遍历矩阵,检查 NAN 和 INF 的适当值,并以这种方式使用:
#include <iostream>
#include <Eigen/Dense>
#include <vector>
#include <numeric>
namespace eig = Eigen;
int main() {
eig::MatrixXd e(2, 2);
e << 8.0, std::nan("1"), std::numeric_limits <double> ::infinity(), 4.0;
std::cout << e << std::endl;
e = (e.array().isFinite()).select(e, 0.0);
std::cout << e << std::endl;
return 0;
}
// Output:
//
// 8 nan
// inf 4
// 8 0
// 0 4
还有一个名为 isZero 的函数,但它仅应用于矩阵 returns 布尔值。我的问题是,是否有一个功能与 isFinite 功能相同,但检查值,例如零?
编辑:
谢谢,我选择了带有abs()的版本,但是有些事情让我感到困惑:当我执行以下操作时:
int main() {
eig::MatrixXd e_1(2, 2);
eig::MatrixXd e_2(2, 2);
e_1 << 8, 2, 3, 4;
e_2 << 1, 0, 0, 2;
e_1 = (e_2.array().abs() < 1.0E-10).select(e_1, 0.0);
std::cout << e_1 << std::endl;
}
// Output:
//
// 0 2
// 3 0
代码与我想的相反,它将 e_1 的条目更改为零,其中 e_2 不为零,所以我必须翻转小于登录到一个比标志大的地方。为什么会这样?
如果你想按元素检查零,你可以简单地写
(e.array()==0)
完整的工作示例:https://godbolt.org/z/CPBpNu
或者,在不更改数组域的情况下,您可以编写 (https://godbolt.org/z/R6v96R):
e.cwiseEqual(0)
注意检查浮点值是否相等时的常见注意事项。
要检查小数字,您可以这样写
(e.array().abs() < 1e-10)