在特征阵列上执行布尔操作

Performing boolean operations on Eigen arrays

本文关键字:布尔 操作 执行 特征 阵列      更新时间:2023-10-16

我正在尝试在特征矩阵上使用各种布尔操作。例如,将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表示的值,因为您无法代表在此模板参数中使用浮点或双打,我也无法将此方法与在运行时确定的值而不是编译时间一起使用。使用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特定解决方案(例如匿名函数)相比,我不知道这种性能。