我知道似乎直截了当的回答是 NO 。然而,我想知道是否没有办法让它发挥作用。
基本上,我想从分布中随机抽取,只保留那些尊重某个条件并填充预先确定的存储矩阵并在矩阵填满后停止。
由于这些是平局,我想我可以利用Matlab的并行功能,但由于存储矩阵的完成取决于绘制的顺序,我觉得存在问题。
或者,有没有办法对手头的问题进行时间检查。例如,我会使用一个非常大的限制的parfor,但包括一种以频繁的间隔检查存储矩阵大小的方法。
在伪代码中,它会给出:
A=zeros(100,1); Naccepted=0;Ntried=0;
parfor i=1:100000000000
x(i)=randn(1,1)
if x(i)>0, Naccepted=Naccepted+1; Ntried=Ntried+1; A(j,1)=x(i), else Ntried=Ntried+1
A
的大小已达到100,则每5分钟检查一次计时器(我不知道在Matlab中实现它)。如果是这样,那么停下来并进行前100次接受抽奖。如果没有,请继续。我意识到我的问题非常混乱,但我没有正确看到哪个部分可以并行工作。
好的,想通了:
matlabpool open 8
tic
clear;
j=1;
Naccepted=0;
A=[];
workers=8;
while size(A,1)<=100
spmd(workers)
x=zeros(10,1);
for i=1:10
x(i)=randn(1,1);
end
end
for k=1:workers
Z(:,k)=x(1,k);
end
for k=1:workers
V(1+(k-1)*10:10+(k-1)*10,1)=cell2mat(Z(1,k));
end
V=V(V>0);
A=[A;V];
Naccepted(j,1)=size(V,1);
j=j+1;
end
Ntried=j*workers*10;
rejection=1-sum(Naccepted)/Ntried;
A=A(1:100,1);
toc
matlabpool close
答案 0 :(得分:0)
直接使用while
循环是不可能的,但是,有一个小技巧可以使用。
while
循环可以分解为for
循环,同时检查与while
循环相同的条件。
如果可以使用for
循环,那么在适当使用循环内的变量(广播,切片等)的情况下,可以使用parfor
循环。< / p>
举个例子:
clear
nb_tests=1e8;
tic
i=1;
captured=zeros(1,nb_tests);
while i<nb_tests
tester=rand;
if tester>0.5
captured(i)=tester;
i=i+1;
end
end
toc
tic
captured=zeros(1,nb_tests);
for i=1:nb_tests
respect=0;
while respect<1
tester=rand;
if tester>0.5
captured(i)=tester;
respect=1;
end
end
end
toc
parpool
tic
captured=zeros(1,nb_tests);
parfor i=1:nb_tests
respect=0;
while respect<1
tester=rand;
if tester>0.5
captured(i)=tester;
respect=1;
end
end
end
toc
请注意,当您进行大量迭代或循环内容更复杂时,并行化的优势就会随之而来。