0

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

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

  • 对 100000 x 2 的随机数据矩阵进行采样。
  • 将其拆分为 (100,000 / 200) = 500 个 200 行 x 2 列数据矩阵的列表。
  • 使用多核列表应用函数 ( mclapply,它可以将矩阵作为列表中的“项目”处理),我能够将这些具有 2 维的较小数据矩阵发送到相同的函数,尽管在不同的线程中。
  • 该函数有条件地在第二列上随机重新排列第一列,以产生一定的相关性。然后它返回重新排列的矩阵。我不是要求这部分,我只是提到这一点是为了排除通过独立创建x和跳过步骤的解决方案y
  • 列表应用功能自动将这 500 个 200 行 x 2 列的拆分组合成一个大矩阵(100,000 x 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;
}

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

我尝试的另一种方法是y在 mapper 函数中生成 ,将其X作为输入,然后使用 ,以拆分形式映射,生成,返回拆分并使用 reduce 将其合并y到一个新变量中。这有严重的随机问题,因为我无法发送额外的参数。QtConcurrent:mappedReduced()xyyQVector<double> ygenerator

我只是在这里展示我的努力,但请随意以您喜欢的任何方式(尽管结果相同)来解决问题。

最终目标:

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

0 回答 0