2013-08-21 66 views
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 

謝謝您的回答!

+0

您不能因爲您在一次迭代和下一次迭代之間創建依賴關係,而對於並行執行,您需要一個「無序」循環。 – Oleg

+0

感謝您的意見。奧列格,這正是我的想法。馬克,積極的條件只是舉一個簡單的例子,手頭上的一個稍微複雜一點。我能想到的唯一解決方案是將問題分解到Matlab會話中的工作人員數量,並要求每位工作人員接受100/w的抽獎。任何關於計時器的想法?謝謝。 – user89073

回答

0

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

A while循環可以分解爲for循環,並檢查與while循環相同的條件。

如果可以使用for循環,則可以在循環內使用適當的變量(廣播,切片等)來使用循環。

給你舉個例子:

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 

注意,並行踢的時候你要麼有大量的迭代或當循環的內容比較複雜的優點。