複数指数化の実装
答えて
これはどれくらい速くなければなりませんか?アルゴリズムのサイズにもよりますが、パワー関数はあまりボトルネックであってはいけません。
次のような単純な関数を記述します。
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関連の投稿でなければあまり役に立ちませんが、そのようなタグは付けられていません)。
希望これは、あなたの質問に答える:)
'if'文は多くの点で悪いです:)何らかの間違った条件(おそらくサイズが意味する)をチェックするだけでなく、スローするのではなくリターンしようとし、関数にvoid以外のリターン型があるときは何も返そうとしません。とにかくそれを削除することを考えてください、これはちょうどサンプルコードです。 – unkulunkulu
私はvec1.length()!= vec2.length()、感謝:)アサーションに変更しました:) –
@Shaktal:アサーションでもセミコロンが必要です。 – TonyK
あなたが(それはあなたの性能要件を満たしていることを確認していない)tommathを試みたことがありますか?その多精度整数arithライブラリ!
以下は、データが浮動小数点であることを前提としています。多倍精度整数を使用する場合は、要件を指定してください。
きれいな数字の方法は、もちろんログを最初に取ることです。確かに、結果が有限であっても、部分積は容易にアンダーフロー/オーバーフローする可能性があります。
慣用対応する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_product
とinner_product
アルゴリズムを置き換えることができるという利点を有しますアルゴリズムを使用する(または自分で書き込む)。
- 1. 指数木の実装
- 2. Androidの複数の実装
- 3. Web2py - 複数のオプションのチェックボックスの実装
- 4. 複数のファイルでのクラスの実装
- 5. 複数のランナーのjunit実装
- 6. 複数のインターフェイスとオブジェクトインスタンスの実装.Net
- 7. 複数のUITableViewCell型の実装
- 8. 複数のインターフェイス実装との混乱
- 9. Structuremap - 複数のインターフェイスの実装
- 10. Autofac - 複数の実装を使用
- 11. 城ウィンザー3.0、サービスと複数の実装
- 12. ビットマップゲームオブジェクトの複数インスタンスを実装する
- 13. Castle Windsor - インターフェイスの複数実装
- 14. この指数アルゴリズムのBig-O複雑さの単純化
- 15. クロスランゲージ変数 - 実装
- 16. NSTimerを使用して指数バックオフでリトライロジックを実装する
- 17. 関数の "show"の実装
- 18. Gnuplotと複素指数
- 19. rand関数の実装
- 20. 関数の実装execve(unistd.h)
- 21. ヌル関数の実装
- 22. 条件変数の実装
- 23. 周波数サンプリングフィルタの実装
- 24. C#複数のインターフェイスの実装を返すメソッドとのインターフェイス
- 25. 複数のプロバイダでの認証の実装
- 26. DIとの1つのインターフェイスに対する複数の実装
- 27. 部分的に特化したメンバ関数の実装
- 28. 相補誤差関数erfcf()のベクトル化可能な実装
- 29. インタフェースの実装の指定
- 30. "sum"を使用してOctaveで複数の変数のグラデーションディセントを実装する
これは悪いようではありません。可能であれば、グラフィックベースの場合は、GPU経由でもすばやく実行できます。 –
データの種類を指定してください:浮動小数点数または大きな整数。どちらの場合も、prod(a_i^b_i)を計算する方法は非常に異なります。 –