在特征数组上执行布尔运算

时间:2017-09-06 10:08:48

标签: c++ eigen c++98

我试图在特征矩阵上使用各种布尔运算。例如,将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; };

1 个答案:

答案 0 :(得分:0)

另一种方法是使用select函数。

const float MaxValue = pow(n, p);
matrix1 = (matrix1.array() > MaxValue).select(MaxValue, matrix1);

然而,与编写普通循环或C ++ 11特定解决方案(如匿名函数)相比,我并未意识到这一点的性能。