在MATLAB中跨并行调用创建随机矩阵时的可再现结果
我想创建一些随机矩阵,但它们非常大,无法放入内存,所以我想找到一种方法在计算机上复制它们,这样当我需要将它们发送到另一台机器时,我只需要发送代码。 以下是我想做的:在MATLAB中跨并行调用创建随机矩阵时的可再现结果,matlab,matrix,random,Matlab,Matrix,Random,我想创建一些随机矩阵,但它们非常大,无法放入内存,所以我想找到一种方法在计算机上复制它们,这样当我需要将它们发送到另一台机器时,我只需要发送代码。 以下是我想做的: num_of_iters = 10; K = 200; for iter = 1:num_of_iters parfor j = 1:K R = make_random_R(iter,j,.....); % Do something end end 我担心的是parfor循环,我需要
num_of_iters = 10;
K = 200;
for iter = 1:num_of_iters
parfor j = 1:K
R = make_random_R(iter,j,.....);
% Do something
end
end
我担心的是parfor循环,我需要能够重现随机矩阵,无论parfor中的索引顺序如何。因此,我决定使用MATLAB流来实现这一点:
- 保存全局流
- 创建一个新的流,设置种子和适当的子流(取决于iter和j)
- 算算
- 把全球流放回去
substream_id=(iter-1)*K+j;
)行中:
我想知道代码是否正确,它是否在函数调用后保留全局流的状态?请帮助我,非常感谢你MATLAB从一个“已知”但“复杂”的函数生成随机数,这样你就可以生成相同的随机序列了!号码 为此,应使用“rng”功能
将rng设置为默认值,以便重置随机数生成
rng('default');
rand(1,5)
ans=
0.8147 0.9058 0.1270 0.9134 0.6324
如果你想重现这个随机数序列,你可以写:
rng('default');
rand(1,5)
ans=
0.8147 0.9058 0.1270 0.9134 0.6324
另一种方法是获取/设置随机数生成的种子:
s=rng;
rand(1,5)
ans= 0.0975 0.2785 0.5469 0.9575 0.9649
并复制相同的序列号
rng(s);
rand(1,5)
ans=
0.0975 0.2785 0.5469 0.9575 0.9649
注意,“rng”本身是一个丰富的函数,您可以在matlab文档中对其进行更多的研究
(我希望我能正确理解这个问题)
回答@m7913d的评论
“默认情况下,MATLAB®客户端和MATLAB工作人员使用不同的
随机数生成器,即使工作人员是本地
与客户端在同一台计算机上群集。对于客户端
默认为Mersenne捻线器生成器(“捻线器”),用于
默认情况下是组合的多个递归生成器
('CombRecursive'或'mrg32k3a')。如果需要生成
客户机和工人中的数字流相同,您可以将其设置为1
匹配另一个。”
显然,matlab工作人员使用的函数(用于生成随机数)与matlab本身不同,因此您也可以在“rng”函数中设置默认函数
rng(5,'twister') % for using twister method to generate random number
显示您可以在parfor中复制随机数序列的新示例:
>> parfor i=1:3
rng(3,'twister');
rand(1,5)
i
end
ans =
0.5508 0.7081 0.2909 0.5108 0.8929
ans =
3
ans =
0.5508 0.7081 0.2909 0.5108 0.8929
ans =
1
ans =
0.5508 0.7081 0.2909 0.5108 0.8929
ans =
2
评论的重要部分:
关于“客户端工作人员”,正如我之前所说,matlab为所有客户端工作人员使用默认函数,因此结果是完全可复制的,只是创建随机数的默认函数不同于matlab自己的默认函数。这不是一个问题,您可以在matlab及其工作人员中使用rng函数设置默认函数(答案中的最后一个示例)
关于使用全局流,使用全局流没有区别,您应该使用rng函数设置种子值以获得相同的可复制结果,全局流只是指示您使用哪个函数生成随机数,matlab有大约6个函数来完成这项工作,但是如果你有自己的函数,你可以在全局流上设置它,然后再次使用rng函数在每次生成随机数时获得相同的序列
请注意,
rng
在parfor循环中有一个。恐怕这不能回答我的问题。首先,我问我的实现是否正确,而你根本没有涉及这一部分:(.其次,文档中的引用说明客户机和工作人员使用不同的随机生成器,但它没有解决这样一个事实,即在parfor循环中,每个工作人员使用的索引是完全未指定的(由于并行化)因此,为了在每次调用parfor循环时生成相同的结果,您必须以某种方式使用随机生成器中的索引。由于我们要分别在每个辅助进程上生成数字,我假设我们必须使用随机流(而不是像您使用的rng函数那样使用全局流)。@Dangmanchuong在您的实现中,您必须使用相同的种子来复制相同的随机数序列,因此,当您尝试生成新的随机数时,只需在每个循环中的代码中添加“rng(您想要的种子数)”。
rng(5,'twister') % for using twister method to generate random number
>> parfor i=1:3
rng(3,'twister');
rand(1,5)
i
end
ans =
0.5508 0.7081 0.2909 0.5108 0.8929
ans =
3
ans =
0.5508 0.7081 0.2909 0.5108 0.8929
ans =
1
ans =
0.5508 0.7081 0.2909 0.5108 0.8929
ans =
2