2011-11-06 150 views
1

我有一段代碼將圖像矩陣img分成小塊並平行工作。但是Matlab說parfor循環無法使用,因爲outC{i,j}被編入索引。我該如何解決?在matlab中使用parfor子矩陣

子矩陣大小不同。如果img=[4x7],然後

C=[3x3 3x3 3x1; 
    1x3 1x3 1x1] 

在一個側面說明,我不知道,如果使用電池陣列這裏是一個不錯的主意。如果沒有,請隨時就如何劃分img提出建議。

C=mat2cell(img, rowSplit, colSplit); 
[rowc,colc]=size(C); 
outC=cell(rowc,colc); 
parfor i=1:rowc 
    for j=1:colc 
     outC{i,j}=doWork(C{i,j}); 
    end 
end 

回答

4

您可以對輸入和輸出使用線性索引。

首先,我讓你的形狀的假裝輸入,以及一個簡單的doWork功能:

>> C= {rand(3) rand(3) rand(3,1); rand(1,3) rand(1,3) rand(1)}; 
>> C 
C = 
    [3x3 double] [3x3 double] [3x1 double] 
    [1x3 double] [1x3 double] [ 0.3922] 
>> doWork = @(x)2*x; 

然後使用線性索引:

>> outC=cell(size(C)); 
>> parfor ci=1:numel(C) 
    outC{ci} = doWork(C{ci}); 
    end 

快速檢查,它的工作:

>> outC{2,1}./C{2,1} 
ans = 
    2  2  2 
0

只需構建一個輸出向量,然後使用reshape將其作爲矩陣。

+0

你能告訴我怎麼做到這一點嗎?子矩陣具有不同的大小,例如, img = [4x7]變爲C = [3x3 3x3 3x1; 1x3 1x3 1x1]。 –

+0

@Usavich:我的意思是單元陣列。如果你寫了'outC {i + j * colc} = ...',然後調用'reshape',它會起作用嗎? –

1

雖然這裏有很多答案可以幫助使用parfor塊來做你所需要的,我會認爲更好的解決方案可能是使用spmd塊代替。

與其將您的圖片拆分爲單元格陣列中的較小部分,不如考慮將其轉換爲distributed array,或許按照您當前所做的相同部分進行分發。在spmd區塊中,您可以執行您的doWork函數,並且該函數將應用於該工作人員上存在的(合)分佈式數組的任何部分。最後,您可以將結果和gather彙總回客戶端。

我發現spmdparfor更復雜,但是一旦你瞭解它,它就非常強大;我認爲這個例子可以非常方便地用這種形式表達出來。

+0

你能舉一個例子嗎?我有一張圖片我想對其應用過濾器。例如,一個半徑爲5的過濾器。什麼是放行它的最好方法?謝謝。 – Royi