2013-08-21 2 views
1

Я знаю, что кажется прямым ответом NO. Тем не менее, мне интересно, нет ли способа заставить его работать.Можно ли использовать параллельную петлю «while» при использовании MATLAB? [Решено]

В принципе, я хотел бы случайным образом рисовать из дистрибутива и поддерживать только тех, кто соблюдает определенное условие, и заполнять предварительно определенную матрицу хранения и останавливаться после того, как матрица заполнена.

Поскольку это ничья, я полагаю, что я могу использовать параллельные возможности 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
  • Проверьте с помощью таймера каждые 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 

Спасибо за ваши ответы!

+0

Вы не можете, потому что вы создаете зависимость между одной итерацией и следующей, а для параллельного выполнения вам нужен «бесхозный» цикл. – Oleg

+0

Спасибо за ваши комментарии. Олег, это именно то, что я думал. Марк, положительное условие состояло только в том, чтобы привести пример простого случая, один под рукой немного сложнее.Единственное решение, о котором я мог думать, - это разбить проблему на число рабочих в моей сессии Matlab и спросить 100/w принятых ничьих для каждого рабочего. Любая идея о таймере? Спасибо. – user89073

ответ

0

Использование петли while невозможно, однако есть небольшой трюк, который можно использовать.

Петля while может быть разложена в петлю for в сочетании с проверкой того же состояния, что и петля while.

Если можно использовать петлю 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 

посоветуйте что преимущество распараллеливания пинков, когда вы либо иметь много итераций или когда содержание цикла является более сложным.

Смежные вопросы