我试图在特征矩阵上使用各种布尔运算。例如,将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; };
答案 0 :(得分:0)
另一种方法是使用select函数。
const float MaxValue = pow(n, p);
matrix1 = (matrix1.array() > MaxValue).select(MaxValue, matrix1);
然而,与编写普通循环或C ++ 11特定解决方案(如匿名函数)相比,我并未意识到这一点的性能。