使用MATLAB时是否可以并行使用“while”循环?

时间:2013-08-21 15:48:42

标签: matlab parallel-processing

我知道似乎直截了当的回答是 NO 。然而,我想知道是否没有办法让它发挥作用。

基本上,我想从分布中随机抽取,只保留那些尊重某个条件并填充预先确定的存储矩阵并在矩阵填满后停止。

由于这些是平局,我想我可以利用Matlab的并行功能,但由于存储矩阵的完成取决于绘制的顺序,我觉得存在问题。

或者,有没有办法对手头的问题进行时间检查。例如,我会使用一个非常大的限制的parfor,但包括一种以频繁的间隔检查存储矩阵大小的方法。

在伪代码中,它会给出:

  • 创建存储矩阵的大小:A=zeros(100,1); Naccepted=0;Ntried=0;
  • 启动for循环: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

1 个答案:

答案 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

请注意,当您进行大量迭代或循环内容更复杂时,并行化的优势就会随之而来。