使用QtConcurrent的随机因变量

时间:2013-09-05 09:11:14

标签: c++ r qt parallel-processing statistics

我遇到了设计问题。准备,因为会有很多未来,也许对于SO来说这是一个太复杂的问题。

对于熟悉R的人来说,这可能会有所帮助: 我在R中创建了一个包,用于创建变量之间的相关性(用于模拟)。我创建了一个多线程版本以允许并行。虽然R使它看似令人尴尬地平行,但我几乎在C ++中重新考虑这个陈述。

  • 使用2个随机数据矩阵对100000进行采样。
  • 将其拆分为(100,000/200)= 500个分组的200行乘2列数据矩阵列表。
  • 使用多核列表应用函数(mclapply,它可以将矩阵作为列表中的“项”处理),我能够将这些具有2维的较小数据矩阵发送到同一函数,但是不同的主题。
  • 函数随机在第二列上有条件地重新排列第一列以产生一定的相关性。然后它返回重新排列的矩阵。我不是要求这一部分,我只是提到这个,以便通过独立创建xy来解决跳过步骤的解决方案。
  • 列表应用功能会自动将这200个200行2列的分组粘合成一个大矩阵(100,000乘2)。
listdata:

 [[1]] 
  [1]  [2]
  ...  ...
  ...  ...
 [[2]]
  [1]  [2]
  ...  ...
  ...  ...

申请:

mclapply(listdata, myFunction, cores=4)

结果:

  [1]   [2]
  ...   ...
  ...   ...
  ...   ...
  ...   ...

随机性

我想要一个线程安全的,统计上随机的(与伪随机无关的结果)函数,产生聚合的依赖xy向量。

  • 随机性很难,因为随机生成器通常存在全局状态,在并行情况下无法共享。

我的一些解决方案显示线程都使用了相似的值,使用R不会发生。

Qt的

我正在使用Qt,并且我尝试使用QtConcurrent来创建正确的(方便用户)线程数量,给定可变数量的拆分。

我首先要说的是我找不到能够将多个参数传递给QtConcurrent中的函数的方法。他们似乎都专注于绘图,而不允许额外的论点。

尝试如下:

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;
}

由于某种原因,此返回似乎并未影响原始列表。

我尝试的另一种方法是在mapper函数中生成y,将其作为输入X,并使用yQtConcurrent:mappedReduced()返回到新变量中,映射在分割格式中超过x,生成y,返回y拆分,并使用reduce将它们合并到QVector<double> y中。这有严重的随机问题,因为我无法发送generator作为额外参数。

我只是在这里展示我的努力,但你可以随心所欲地解决问题(虽然结果相同)。

最终目标:

// Whether or not packed in a QList< >:
QVector<double> x = {..., ..., ..., ...};
QVector<double> y = {..., ..., ..., ...}; // dependent on x

0 个答案:

没有答案