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)