我有大約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。不幸的是,節省很慢...
'compare'做了什麼?列表中的示例行是什麼? – Jonas 2010-05-20 11:04:44
對於數據矩陣A和B,它計算A'* B並用單位矩陣卷積產品。 矩陣被標準化;行和列包含從0到1的值,總計爲1. 由比較產生的矩陣包含從-30到30的值,它們大致遵循極值分佈。 – 2010-05-20 11:11:46
那麼使用'eval'的原因是什麼? – Jonas 2010-05-20 11:17:30