特征:将向量的每个元素与常量进行比较
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;
}
在这种情况下,res
和 res2
是 CwiseBinaryOp
,其中包含 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 可能知道原因。但我(和你?)没有,因此也不想依赖它。
有没有办法将向量的每个元素与常数进行比较?到目前为止,我正在比较二维向量 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;
}
在这种情况下,res
和 res2
是 CwiseBinaryOp
,其中包含 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 可能知道原因。但我(和你?)没有,因此也不想依赖它。