1

我有大約5000個矩陣,行數和列數不等(20 x〜200)。這些矩陣中的每一個都必須在動態編程算法中相互比較。並行化或矢量化大量矩陣的全部反對操作?

this問題,我問如何快速執行比較,並給出了一個很好的答案,涉及二維卷積。串聯,迭代地應用該方法中,像這樣

list = who('data_matrix_prefix*') 
H = cell(numel(list),numel(list)); 
for i=1:numel(list) 
    for j=1:numel(list) 
     if i ~= j 
      eval([ 'H{i,j} = compare(' char(list(i)) ',' char(list(j)) ');']); 
     end 
    end 
end 

是快速的數據的小的子集(例如,對於9點矩陣,9×9 - 9 = 72個調用在〜1秒製成,870的呼叫在〜2.5 S)。
但是,對所有數據進行操作需要接近2500萬次呼叫。
我也曾嘗試使用協議(),使整個數據中的下一個元素組成的單元陣列,這樣我就可以在一個循環中使用cellfun():

# who(), load() and struct2cell() calls place k data matrices in a 1D cell array called data. 
nextData = cell(k,1); 
for i=1:k 
    [nextData{:}] = deal(data{i}); 
    H{:,i} = cellfun(@compare,data,nextData,'UniformOutput',false); 
end 

不幸的是,這是不是真的任何更快,因爲所有的時間都在比較()。這兩個代碼示例似乎都不適合並行化。我無法弄清楚如何使我的變量分片。
compare()是完全向量化的;它僅使用矩陣乘法和conv2()(我認爲所有這些操作,包括cellfun()都應該在MATLAB中是多線程的)。

有沒有人看到(明確)並行解決方案或更好的向量化問題?


我同時實現我的實例是低效率的 - 第一會快兩倍,如果它計算出的三角形的單元陣列,並且第二仍在計算自比較,以及。但是,一個好的並行化所節省的時間更像是一個16的因子(如果我在每個人的機器上安裝MATLAB,那麼節省的時間是72)。

Aside
還有一個內存問題。我使用了幾個evals將H的每一列附加到一個文件中,使用H1,H2等名稱,然後清除H i。不幸的是,節省很慢...

+1

'compare'做了什麼?列表中的示例行是什麼? – Jonas 2010-05-20 11:04:44

+0

對於數據矩陣A和B,它計算A'* B並用單位矩陣卷積產品。 矩陣被標準化;行和列包含從0到1的值,總計爲1. 由比較產生的矩陣包含從-30到30的值,它們大致遵循極值分佈。 – 2010-05-20 11:11:46

+0

那麼使用'eval'的原因是什麼? – Jonas 2010-05-20 11:17:30

回答

1

第二個例子可以很容易地切片使用並行處理工具箱。該工具箱將代碼的迭代分佈在多達8個不同的本地處理器中。如果你想在集羣上運行代碼,你還需要分佈式計算工具箱。

%# who(), load() and struct2cell() calls place k data matrices in a 1D cell array called data. 

parfor i=1:k-1 %# this will run the loop in parallel with the parallel processing toolbox 
    %# only make the necessary comparisons 
    H{i+1:k,i} = cellfun(@compare,data(i+1:k),repmat(data(i),k-i,1),'UniformOutput',false); 

    %# if the above doesn't work, try this 
    hSlice = cell(k,1); 
    hSlice{i+1:k} = cellfun(@compare,data(i+1:k),repmat(data(i),k-i,1),'UniformOutput',false); 
    H{:,i} = hSlice; 
end 
+0

「由於使用nextData的方式,PARFOR循環無法運行。」 另外它不想切片數據(這是一維單元陣列)。 – 2010-05-20 11:31:22

+0

它不會對數據進行分片,因爲您在調用cellfun時使用了整個數組'data'。另外,我用'nextData'解決了這個問題 – Jonas 2010-05-20 12:33:17

+0

謝謝......現在M-Lint很高興。但repmat可以返回單元格數組的重複元素嗎?它將它們連接在一起並創建一個大矩陣。 – 2010-05-20 20:25:52

0

如果我理解正確,你必須執行5000^2矩陣比較?而不是試圖平行比較功能,也許你應該想到你的問題由5000^2任務組成? Matlab Parallel Compute Toolbox支持基於任務的並行處理。不幸的是,我對PCT的經驗是大型線性代數類型問題的並行化,所以我不能告訴你更多的東西。該文檔無疑將幫助您更多。

3

是否

compare(a,b) == compare(b,a) 

compare(a,a) == 1 

如果是這樣,你的循環改變

for i=1:numel(list) 
    for j=1:numel(list) 
    ... 
    end 
end 

for i=1:numel(list) 
    for j= i+1 : numel(list) 
    ... 
    end 
end 

並處理對稱和身份的情況。這會減少一半的計算時間。

+0

我應該看到。 +1 – Jonas 2010-05-20 13:47:14

+0

對稱案例是轉置和身份案件不是1,但沒有用。謝謝,我認爲這也會幫助我解決記憶問題。 – 2010-05-20 20:31:00