特征:将向量的每个元素与常量进行比较

Eigen: Comparing each element of vector with constant

有没有办法将向量的每个元素与常数进行比较?到目前为止,我正在比较二维向量 Eigen::Vector2d 和常量 double tolerance,如下所示:

    if (x(0) > tolerance && x(1) > tolerance)
    {
     ...
    }

我找到了 isApprox() 函数,但不知何故它不起作用。有没有更好的或推荐的方法?

一种方法是使用 Vector class 的 array 方法。像这样:

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

int main(int argc, char * argv[]) {
    Eigen::Vector2d A{ 7.5, 8.2 };
    std::cout << A << '\n';
    auto res = A.array() >= 8.0;
    std::cout << res << '\n';
    if (res.all()) {
        std::cout << "True" << '\n';
    }
    else {
        std::cout << "False" << '\n';
    }

    A(0) = 10.2;
    auto res2 = A.array() >= 8.0;
    std::cout << res2 << '\n';
    if (res2.all()) {
        std::cout << "True" << '\n';
    }
    else {
        std::cout << "False" << '\n';
    }

    return 0;
}

在这种情况下,resres2CwiseBinaryOp,其中包含 A 中每个元素的布尔值。当两者都是 True.

时,使用 all 查找

我觉得写一个简单的函数比较好:

bool is_componentwise_greater_than(
    Eigen::Ref<Eigen::VectorXd const> const &vector, double lower_bound) {
  for (auto value : vector) {
    if (value <= lower_bound)
      return false;
  }
  return true;
}

与@Matt 的解决方案相比,这种方式的缺点是,对于更复杂的用例,使用 Eigen 表达式可以提高性能(不知道,如果这适用于此)。

这种解决方案的(在我看来是巨大的)优势在于,您 可以从它的用法中确切地看到它的作用。

当然,您也可以将 Matts 解决方案打包到一个恰当命名的函数中,以获得此优势。另一个优点是,使用我提供的函数,您可以确切地知道它的作用,而不必怀疑,使用具有 Eigen 类型的 auto 是否会影响您。我猜不会,Matt 可能知道原因。但我(和你?)没有,因此也不想依赖它。