1
我知道,它似乎是直接的答案是NO。然而,我想知道是否沒有辦法讓它工作。使用MATLAB時可以並行使用「while」循環嗎? [解決]
基本上,我想從分佈中隨機抽取,只保留那些尊重某個條件並填充預定義存儲矩陣並在矩陣滿後停止的人。由於這些是繪製的,我想我可以利用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
謝謝您的回答!
您不能因爲您在一次迭代和下一次迭代之間創建依賴關係,而對於並行執行,您需要一個「無序」循環。 – Oleg
感謝您的意見。奧列格,這正是我的想法。馬克,積極的條件只是舉一個簡單的例子,手頭上的一個稍微複雜一點。我能想到的唯一解決方案是將問題分解到Matlab會話中的工作人員數量,並要求每位工作人員接受100/w的抽獎。任何關於計時器的想法?謝謝。 – user89073