对 Eigen 数组执行布尔运算
Performing boolean operations on Eigen arrays
我正在尝试对特征矩阵使用各种布尔运算。例如,将 NaN 或 Inf 值设置为特定值。或者将高于或低于特定值的值设置为其他值。
我可以遍历每个值并执行每个布尔运算,但我想这可能会错过矢量化,特别是在我没有自动矢量化的 C++98 编译器上。
例如我可以使用 unaryExpr
template <int replacementValue>
static float ReplaceNanWithValue(float value)
{
if (std::isnan(value) == true)
{
value = static_cast<float>(replacementValue);
}
return value;
}
matrix1 = matrix1 .unaryExpr(std::ptr_fun(ReplaceNanWithValue<1>));
但是,因为我使用的是 C++98,所以我使用模板参数将我设置 Nan 的值限制为可以用 int 表示的值,就像您可以的那样也不要将 float 或 double 与此模板参数一起使用我也无法将此方法与在运行时而不是编译时确定的值一起使用。使用 C++11,我可以使用匿名函数来执行此操作
const float MaxValue = pow(n, p);
matrix1 = matrix1.unaryExpr([&MaxValue](float value) { return (value > MaxValue) ? MaxValue : value; };
替代方法是使用 select 函数。
const float MaxValue = pow(n, p);
matrix1 = (matrix1.array() > MaxValue).select(MaxValue, matrix1);
然而,与编写普通循环或 C++11 特定解决方案(例如匿名函数)相比,我不知道这样做的性能。
我正在尝试对特征矩阵使用各种布尔运算。例如,将 NaN 或 Inf 值设置为特定值。或者将高于或低于特定值的值设置为其他值。
我可以遍历每个值并执行每个布尔运算,但我想这可能会错过矢量化,特别是在我没有自动矢量化的 C++98 编译器上。
例如我可以使用 unaryExpr
template <int replacementValue>
static float ReplaceNanWithValue(float value)
{
if (std::isnan(value) == true)
{
value = static_cast<float>(replacementValue);
}
return value;
}
matrix1 = matrix1 .unaryExpr(std::ptr_fun(ReplaceNanWithValue<1>));
但是,因为我使用的是 C++98,所以我使用模板参数将我设置 Nan 的值限制为可以用 int 表示的值,就像您可以的那样也不要将 float 或 double 与此模板参数一起使用我也无法将此方法与在运行时而不是编译时确定的值一起使用。使用 C++11,我可以使用匿名函数来执行此操作
const float MaxValue = pow(n, p);
matrix1 = matrix1.unaryExpr([&MaxValue](float value) { return (value > MaxValue) ? MaxValue : value; };
替代方法是使用 select 函数。
const float MaxValue = pow(n, p);
matrix1 = (matrix1.array() > MaxValue).select(MaxValue, matrix1);
然而,与编写普通循环或 C++11 特定解决方案(例如匿名函数)相比,我不知道这样做的性能。