2011-07-24 24 views
4

実装された複数指数化アルゴリズムを知っている人はいますか?私はベクトルA、BがA [i]^B [i]の積を計算する何かを探しています。複数指数化の実装

ありがとうございます!

+0

これは悪いようではありません。可能であれば、グラフィックベースの場合は、GPU経由でもすばやく実行できます。 –

+1

データの種類を指定してください:浮動小数点数または大きな整数。どちらの場合も、prod(a_i^b_i)を計算する方法は非常に異なります。 –

答えて

0

これはどれくらい速くなければなりませんか?アルゴリズムのサイズにもよりますが、パワー関数はあまりボトルネックであってはいけません。

次のような単純な関数を記述します。

Vector VectorPower(Vector vec1, Vector vec2) 
{ 
     assert(vec1.length() == vec2.length()); 

     Vector vecAns(vec1.length()); 

     for(unsigned int i = 0; i < vec1.length(); i++) 
     { 
      vecAns[i] = pow(vec1[i], vec2[i]); 
     } 

     return vecAns; 

} 

時間のほとんどは、これはあなたのアプリケーションのために十分に効率的になります。平方根やその他の超越関数を実装していた場合は、最適化を検討することになります。

また、一部のプロセッサは任意の積分力に最適化されていますが、GPUは確かにあります(これはGraphics関連の投稿でなければあまり役に立ちませんが、そのようなタグは付けられていません)。

希望これは、あなたの質問に答える:)

+2

'if'文は多くの点で悪いです:)何らかの間違った条件(おそらくサイズが意味する)をチェックするだけでなく、スローするのではなくリターンしようとし、関数にvoid以外のリターン型があるときは何も返そうとしません。とにかくそれを削除することを考えてください、これはちょうどサンプルコードです。 – unkulunkulu

+0

私はvec1.length()!= vec2.length()、感謝:)アサーションに変更しました:) –

+0

@Shaktal:アサーションでもセミコロンが必要です。 – TonyK

0

あなたが(それはあなたの性能要件を満たしていることを確認していない)tommathを試みたことがありますか?その多精度整数arithライブラリ!

2

以下は、データが浮動小数点であることを前提としています。多倍精度整数を使用する場合は、要件を指定してください。

きれいな数字の方法は、もちろんログを最初に取ることです。確かに、結果が有限であっても、部分積は容易にアンダーフロー/オーバーフローする可能性があります。

慣用対応するC++プログラムは次のとおりです。

#include <cmath> 
#include <functional> 
#include <numeric> 

double f(double x, double y) 
{ 
    return y * std::log(x); 
} 

template <typename I, typename J> 
double multi_exponentiation(I a0, I an, J b0) 
{ 
    return std::exp(std::inner_product(a0, an, b0, 0., std::plus<double>(), f)); 
} 

// Example program 
int main() 
{ 
    std::vector<double> a, b; 
    ... 
    double e = multi_exponentiation(a.begin(), a.end(), b.begin()); 
} 

inner_productを使用する代わりに、ループを書いて、自分では、パフォーマンスが問題であることを知っているたら、あなたはparallel_inner_productinner_productアルゴリズムを置き換えることができるという利点を有しますアルゴリズムを使用する(または自分で書き込む)。

関連する問題