デザインの問題にぶち当たりました。SO にとっては複雑すぎる問題かもしれないので、準備をしておいてください。
R に精通している人にとっては、これが役立つかもしれません: 変数間の相関関係を作成するためのパッケージを R で作成しました (シミュレーションの目的で)。並列処理を可能にするために、複数のスレッド バージョンを作成しました。R では恥ずかしいほど並列に見えますが、私はこのステートメントを C++ で再考するところです。
- 100000 行 2 列のランダム データ行列をサンプリングします。
- (100,000 / 200) = 200 行 x 2 列のデータ マトリックスの 500 分割のリストに分割します。
- マルチコアのリスト適用関数 (
mclapply
、マトリックスをリスト内の「アイテム」として処理できる) を使用して、これらの 2 次元の小さなデータ マトリックスを同じ関数に送信することができましたが、スレッドは異なります。 - この関数は、条件付きで最初の列を 2 番目の列にランダムに再配置して、特定の相関関係を生成しました。次に、再配置された行列を返しました。私はこの部分を求めているわけではありません. と を個別に作成してステップをスキップするソリューションを除外するためにこれについて言及しているだけ
x
ですy
. - リスト適用関数は、これらの 200 行 x 2 列の 500 分割を 1 つの大きな行列 (100,000 x 2) に自動的に結合します。
listdata: [[1]] [1] [2] ... ... ... ... [[2]] [1] [2] ... ... ... ...
申請中:
mclapply(listdata, myFunction, cores=4)
結果:
[1] [2]
... ...
... ...
... ...
... ...
ランダム性
x
集約された従属およびy
ベクトルを生成する、スレッドセーフで統計的にランダムな (疑似ランダム性とは無関係な結果) 関数が必要です。
- 通常、ランダム発生器にはグローバルな状態があり、並列状況では共有できないため、ランダム性は困難です。
私の解決策のいくつかは、スレッドがすべて同様の値を使用していることを示しましたが、これは R を使用した場合には起こりません。
Qt
私は Qt を使用しており、可変量の分割を考慮して、適切な (ユーザーにとって便利な) 量のスレッドを作成するために QtConcurrent を使用しようとしています。
最初に、QtConcurrent の関数に複数の引数を渡す方法が見つからなかったと言います。それらはすべて、追加の引数を許可せずにマッピングに焦点を合わせているようです。
1つの試みは次のとおりです。
QList< QVector<double> > list_of_one_split;
QList< QList< QVector<double> > list_containing_all_splits;
QVector<double> vector_of_doubles(10);
qFill(vector_of_doubles.begin(), vector_of_doubles.end(), 1); // not random
list_of_a_split.append(vector_of_doubles); // x variable split
list_of_a_split.append(vector_of_doubles); // y variable split
list_containing_all_splits.append(list_of_a_split) // first split
list_containing_all_splits.append(list_of_a_split) // second split
QtFuture<void> res = `QtConcurrent::map(list_containing_all_splits.begin(),
list_containing_all_splits.end(),
mapFunction)`
QList< QVector<double> > mapFunction(QList< QVector<double> > &list_of_a_split)
{
// random arranging one column on other
return list_of_a_split;
}
何らかの理由で、このリターンは元のリストに影響を与えていないようです。
私が試した別の方法はy
、マッパー関数内で を生成し、それX
を入力として与え、y
を使用して新しい変数に戻し、分割形式でQtConcurrent:mappedReduced()
マッピングし、 を生成し、分割を返し、reduce を使用して にマージすることでした。追加の引数として を送信できないため、これには重大なランダムな問題があります。x
y
y
QVector<double> y
generator
ここでは自分の努力を示しているだけですが、好きな方法で問題にアプローチしてください (結果は同じですが)。
最終的な目標:
// Whether or not packed in a QList< >:
QVector<double> x = {..., ..., ..., ...};
QVector<double> y = {..., ..., ..., ...}; // dependent on x