1

我知道似乎直截了当的答案是否定的。然而,我想知道是否没有办法让它工作。

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

由于这些是绘图,我想我可以利用 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
  • 每 5 分钟检查一次计时器(我不知道在 Matlab 中实现它)是否A达到 100。如果是这样,则停止并进行前 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
4

1 回答 1

0

直接使用while循环是不可能的,但是,有一个小技巧可以使用。

结合检查与循环相同的条件,可以将while循环分解为循环。forwhile

如果可以使用for循环,则可以在适当使用循环内的变量(广播、切片等)的情况下使用parfor循环。

给你举个例子:

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

请注意,当您进行大量迭代或循环内容更复杂时,并行化的优势就会发挥作用。

于 2018-03-05T08:31:37.513 回答