Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用qt的随机因变量_C++_R_Qt_Parallel Processing_Statistics - Fatal编程技术网

C++ 使用qt的随机因变量

C++ 使用qt的随机因变量,c++,r,qt,parallel-processing,statistics,C++,R,Qt,Parallel Processing,Statistics,我遇到了一个设计问题。做好准备,因为还有很多事情要做,也许这是一个太复杂的问题 对于熟悉R的人,这可能会有所帮助: 我在R中创建了一个包,用于创建变量之间的相关性(用于模拟)。我创建了一个多线程版本以允许并行性。虽然R使它显得很尴尬,但我几乎重新考虑C++中的这个语句。 对100000×2的随机数据矩阵进行采样 将其拆分为(100000/200)=500个200行2列数据矩阵的拆分列表 使用一个多核列表应用函数(mclappy,它可以将矩阵作为列表中的“项”进行处理),我能够将这些具有两个维度

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

对于熟悉R的人,这可能会有所帮助: 我在R中创建了一个包,用于创建变量之间的相关性(用于模拟)。我创建了一个多线程版本以允许并行性。虽然R使它显得很尴尬,但我几乎重新考虑C++中的这个语句。
  • 对100000×2的随机数据矩阵进行采样
  • 将其拆分为(100000/200)=500个200行2列数据矩阵的拆分列表
  • 使用一个多核列表应用函数(
    mclappy
    ,它可以将矩阵作为列表中的“项”进行处理),我能够将这些具有两个维度的较小数据矩阵发送到同一个函数,尽管在不同的线程中
  • 函数在第二列上有条件地随机重新排列第一列,以产生某种相关性。然后返回重新排列的矩阵。我不是在要求这一部分,我只是提到这一点,以排除那些通过独立创建
    x
    y
    跳过步骤的解决方案
  • list apply函数会自动将200行2列的500个拆分部分粘在一起,形成一个大矩阵(100000 x 2)
应用:

mclapply(listdata, myFunction, cores=4)
结果:

  [1]   [2]
  ...   ...
  ...   ...
  ...   ...
  ...   ...
随机性 我想要一个线程安全、统计随机(与伪随机性无关的结果)函数,生成聚合的依赖
x
y
向量


  • 随机性是困难的,因为随机生成器通常有一个全局状态,这在并行情况下是不可能共享的
我的一些解决方案表明,所有线程都使用了类似的值,而使用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;
}

“随机性是困难的,因为随机生成器通常有一个全局状态,在并行情况下不可能共享。”-我不确定情况是否如此,你能不能不使用QMutex?@JamesElderfield谢谢你的回答。两件事。1) 我不知道如何将QMutex放入qtube中。2) 每个拆分中的重新排列需要随机数,当QMutex锁定该情况时,它基本上变成串行而不是并行以获得随机索引。1)本页()有一个在“实用提示”下使用QMutex和QtConcurrent的示例。2) 我明白你的意思了,让它变成串行的,那么在开始时生成一个随机的数字列表,然后使用这个列表为每个线程的独立RNG设置种子呢?我相信这仍然会给你统计上的随机输出(但我不确定)。@JamesElderfield我尝试过使用列表平方的第一个元素作为srand(pow(list[0][0],2)),但这不起作用。另外,当只能向映射器发送一种类型,然后再接收相同的格式时,如何将此列表发送到函数?我不完全确定第一部分的意思,但要将列表发送到函数,我将编写一个包装器类。这个类将包含RNG状态的变量(最初来自随机数列表)、拆分列表以及您可能需要的任何其他变量。然后您可以在这个类上调用mapFunction。
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;
}
// Whether or not packed in a QList< >:
QVector<double> x = {..., ..., ..., ...};
QVector<double> y = {..., ..., ..., ...}; // dependent on x