Я знаю, что кажется прямым ответом 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
Спасибо за ваши ответы!
Вы не можете, потому что вы создаете зависимость между одной итерацией и следующей, а для параллельного выполнения вам нужен «бесхозный» цикл. – Oleg
Спасибо за ваши комментарии. Олег, это именно то, что я думал. Марк, положительное условие состояло только в том, чтобы привести пример простого случая, один под рукой немного сложнее.Единственное решение, о котором я мог думать, - это разбить проблему на число рабочих в моей сессии Matlab и спросить 100/w принятых ничьих для каждого рабочего. Любая идея о таймере? Спасибо. – user89073