ガウス分布を使ってランダムに分布した数値の多次元行列を作成する必要があり、できるだけ最適化したプログラムを作成しようとしています。現在、Boost行列を使用していますが、手作業でループすることなくこれを実現するものは見つけられません。理想的には、Pythonのnumpy.random.randn()関数に似たものが欲しいですが、これはC++で行う必要があります。これを達成する別の方法は、手動でループするよりも速いのですか?ループなしでC++で乱数の行列を作成
答えて
ループを実行する必要がありますが、ループ内で配列の参照を取り除くことができます。真のN次元配列の索引付けは高価になるため、最適なオプションは、基礎となる線形データストアを提供するライブラリ(または自分で書かれたもの)です。
これで、n次元配列全体が線形であるかのようにループすることができます。その結果、次元によるインデックスの多数の乗算が回避されます。
もう一つの最適化は、完全にインデックスを取り除き、最初の要素へのポインタをとり、ポインタ自体を反復することです。これにより、CPU内の変数全体がなくなり、コンパイラに他のもの。例えばベクトル内に1000個の要素がある場合:
vector<int> data;
data.resize(1000);
int *intPtr = &data[0];
int *endPtr = &data[0] + 1000;
while(intPtr != endPtr)
{
(*intPtr) == rand_function();
++intPtr;
}
ここで2つのトリックが発生しました。ループ自体の外側で終了条件を事前に計算します(vector :: size()などの関数の検索を1000回)しないで、インデックスではなくメモリ内のデータへのポインタを使って作業します。インデックスは、配列にアクセスするたびに内部的にポインタに変換されます。 「現在のポインタ」を記憶し、その都度1を加えることにより、インデックスからのポインタを1000回計算するコストが排除される。
このはですが、実装によって異なります。コンパイラは同じハンド最適化を行うことができますが、それらのすべてを行うわけではありません。関数呼び出しのオーバーヘッドを避けるために、rand_functionもインラインでなければなりません。
しかし警告:std :: vectorをポインタtrickで使用するとスレッドセーフではなく、別のスレッドがループ中にベクトルの長さを変更すると、ベクトルがメモリ内の別の場所に再割り当てされる可能性があります。 自身のベクトル、配列、テーブルクラスを必要に応じて書くのが完全に快適でない限り、ポインタトリックはしないでください。
説明をありがとう! – nlhenderson17
- 1. C++はループなしで複数の乱数を生成する
- 2. パッケージなしで混乱行列を作成する方法
- 3. MATLABループなしの配列の通常の乱数生成
- 4. 一意のIDを使用してC#で乱数を作成
- 5. ループなしで行列を作成する方法
- 6. 列内の複数の行に異なる乱数を生成
- 7. c#ループで混乱する
- 8. C#はwhileループで2回乱数を返します
- 9. 2つの異なる配列で乱数を生成するには?(C++)
- 10. 別のループを作成して並列スレッドで実行する
- 11. 私はユニークな整数の乱数で構成される配列を作成しようとしてる
- 12. 擬似乱数乱数生成器で乱数列を生成する正しい方法
- 13. 1から75までの乱数を使った明確な行列を作成してください。
- 14. MATLABで多次元乱数を作成
- 15. forループなしでn個の乱数を生成する方法
- 16. 乱数生成器 - 毎回乱数を生成しない
- 17. 各ループ反復で新しい行列を作成する
- 18. Cで設定した間隔で乱数を生成する
- 19. C#で乱数ジェネレータを作成しようとしています。4.69
- 20. 乱数の1x3配列のNxN配列を作成する
- 21. ループなしで3D最小二乗距離行列を作成しますか?
- 22. C++で10問の乱数算数クイズを作成するには?
- 23. C#でステップ可能な乱数を生成
- 24. 非常に大きな乱数をC++で生成する
- 25. C++で大きな乱数/キーを生成する方法
- 26. C/C++プリプロセッサで一連の乱数を生成する方法
- 27. Cで範囲[0、n)の乱数を生成しますか?
- 28. どのようにC#で乱数を生成しますか?
- 29. ループ用に複数の行列を作成する
- 30. forループでPythonで行列を作成する
[これは 'std :: generate'の仕事のようですね!](http://en.cppreference.com/w/cpp/algorithm/generate)しかし、私はあなたが多くの改善を見ているかどうかは分かりません。 – user4581301
なぜ手動ループが遅いですか? – Jarod42
私は、ループのコストと行列の各要素の値を1つずつ設定することについて心配する必要はないと考えています。私はあなたのプログラムのボトルネックがどこかにあると思う。 –