我想使用std::numeric的算法来计算数组的绝对值之和,以便使用gnu并行扩展(数组大小> 500000)。

这是我当前的代码:

double ret = 0;
for (auto i = 0U; i < length; ++i)
{
    ret += std::abs(tab[i]);
}
return ret;

所以我想到了:
auto sumabs = [] (double a, double b)
{
    return std::abs(a) + std::abs(b);
}

std::accumulate(tab, tab + length, 0, sumabs);

但这是低效率的,因为如果执行归约算法(出于快速计算的目的,我衷心希望如此!),std::abs将应用于已经> = 0的值。

那么有什么办法可以做到这一点?也许是“手工”执行还原的第一步,而std::accumulate在其余的之间做一个简单的加法?但是将会有一个副本和一个存储命中...

最佳答案

您可以将函数传递给accumate方法,并在函数内部执行“手动”评估。顺便说一下,在您的代码中,您将abs方法应用于不必要的第一个参数。

int fAccumulate (int accumulated, int accumulateIncrement)
{
    int retValue = 0;
    if (accumulateIncrement >= 0)
    {
        retValue = accumulated + accumulateIncrement;
    }
    else
    {
        retValue = accumulated + std::abs(accumulateIncrement);
    }
    return retValue;
}

此代码的用法可能是:
int init = 0;
int numbers[] = {10,20,-30};
int a = std::accumulate (numbers, numbers+3, init, fAccumulate);

关于c++ - 使用STL算法计算绝对值之和,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18049965/

10-11 22:54
查看更多