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
、残りの間に簡単な追加を行いましょう。しかし、コピーとメモリヒットがあります...
関数をaccumlateメソッドに渡し、関数内で「手動」評価を実行できます。ちなみに、コードでは、不要な最初のパラメーターに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);
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加