2012-11-24 222 views
1

嗨,這是我第一次使用matlab的並行工具箱。我有這個循環並行for循環matlab

for y=1:size(pxyvector,1) 
    if (strcmp(pxyvector{y,1}, emotionword))&&(strcmp(pxyvector{y,2},tweet{x})) 
      pxyvector{y,3} = pxyvector{y,3} +1; 
      invector = true; 
    end 
end 

我該怎麼去做並行工作for。我閱讀matlab的切片變量部分,但我不明白我在這裏如何做到這一點。

pxyvector是100000x3單元陣列

tweet{x}是一個字符串

emotionword是一個字符串太。

invector是稍後在循環外部使用的值。

所以基本上我比較了pxyvector的一行與情緒詞的第一個值,以及從pxyvectortweet{x}的一行的第二個值。如果他們是一樣的。行中的第三個值會增加。

在循環過程中,相同的值不能遞增兩次。

這個for循環中的問題是我需要更改一個在循環外部使用的變量並增加一個值。

一些數據一起玩:http://ojtwist.be/pxyvector.mat(變量是在這個.MAT文件pxyvector2,所以更改代碼,如果你想測試)

+0

那麼,當您嘗試使用parfor時會出現哪種錯誤?順便說一句,你可以拆分pxyvector並在不同的工作人員上使用SIMD方法。 – Acorbe

+0

pxyvector以不同方式編入索引,可能會導致迭代之間的依賴關係。 invector在parfor循環之後使用,但其值不確定。如何使用SIMD方法在這裏工作? – Ojtwist

+0

'pxyvector'對我來說似乎很好,因爲一次只觸摸一行,也就是說,並行計算它應該沒問題。然而'invector'是一個問題。如何將該行更改爲'invector(y)= true;'?然後它也應該在'parfor'循環中運行。循環後,只需使用'invector = any(invector);'。 –

回答

1

我想這裏的問題是,MATLAB不處理單元格矩陣作爲正常矩陣(實際上{1 ,:}不像您期望的那樣)。

據我所知,使用parfor你需要數據的不同組織,特別是作爲一個Nx1cell3x1cell元素。

下面的作品,例如

tot = size(pxyvector,1) 
%%%%// just to reshape data correctly 
pxvector_a = pxyvector; 
pxyvector = cell(1,tot); 
for i = 1:tot 
    pxyvector{i} = {pxvector_a{i,1} pxvector_a{i,2} pxvector_a{i,3}};  
end 
%%%% 

parfor y=1:tot 
    if (strcmp(pxyvector{y}{1}, 'almost'))&&(strcmp(pxyvector{y}{2},'that')) 
      pxyvector{y}{3} = pxyvector{y}{3} +1; 
      invector = true; 
    end 
end 

你仍然可以使用smpd,但當前數據的組織能做出適當的分佈式陣列的創建努力。

+0

似乎工作:),太糟糕了,它比正常慢 – Ojtwist

+0

@Ojtwist,可能是內存訪問問題:數據分佈變得更加隨機。嘗試分離事物,以便擁有3個(Nx1)單元陣列。 – Acorbe