2013-03-14 72 views
4

我的目標是將許多稀疏矩陣組合在一起形成一個大的稀疏矩陣。我能想到的唯一兩個想法是(1)創建一個大的稀疏矩陣並覆蓋某些塊,(2)單獨創建塊使用vertcat來形成我的最終稀疏矩陣。但是,我讀過overwriting稀疏矩陣效率很低,而且我也讀過vertcat並不是完全有效的計算。 (我並沒有考慮使用for循環,因爲它們效率低下)。如何有效地組合垂直稀疏矩陣

那麼我還有其他的替代方案嗎?

編輯:通過結合我的意思是「膠合」矩陣(垂直),元素不會相互作用。

+0

如果你只是將它們加在一起會發生什麼?更具體地說 - 矩陣的維度是什麼,書中的「組合」矩陣是什麼樣的?你能舉一個玩具的例子嗎? – Floris 2013-03-14 20:43:07

+0

@佛羅里達尺寸範圍可以從2×2到2^18×2^18,或者Matlab可以爲我的腳本處理的最大值。我認爲在2^18左右會產生一個錯誤。玩具的例子可以是任意的。我的矩陣中唯一固定的是第一個也是最後一個塊,它們是'speye',但是它們之間的所有內容都不相同(儘管它們的大小是固定的) – AlanH 2013-03-14 21:18:01

+0

@Floris也不能添加它們b/c我不能找出適用於所有矩陣的全局索引。我只是看到了你的帖子,所以我不認爲這會是問題。 – AlanH 2013-03-14 21:19:26

回答

5

根據MATLAB的幫助下,你可以在「拆解」的稀疏矩陣

[i,j,s] = find(S); 

這意味着,如果你有兩個矩陣ST,並且希望(有效)vertcat它們,你可以做

[is, js, ss] = find(S); 
[it, jt, st] = find(T); 
ST = sparse([is; it + size(S,1)], [js; jt], [ss; st]); 

不知道這是非常有效的...但我猜這不是太糟糕了。

編輯:使用密度爲1%的2000x1000稀疏矩陣,並將其與密度爲2%的另一個相結合,上述代碼在我的機器上運行0.016秒。只是做[S;T]快了10倍。是什麼讓你認爲垂直連接速度很慢?

EDIT2:假設你需要用「多」稀疏矩陣要做到這一點,下面的工作(這是假設你希望他們所有的「在同一個地方」):

m = 1000; n = 2000; density = 0.01; 
N = 100; 
Q = cell(1, N); 
is = Q; 
js = Q; 
ss = Q; 
numrows = 0; % keep track of dimensions so far 

for ii = 1:N 
    Q{ii} = sprandn(m+ii, n-jj, density); % so each matrix has different size 
    [a b c] = find(Q{ii}); 
    sz = size(Q{ii}); 
    is{ii} = a' + numrows; js{ii}=b'; ss{ii}=c'; % append "on the corner" 
    numrows = numrows + sz(1); % keep track of the size 
end 

tic 
ST = sparse([is{:}], [js{:}], [ss{:}]); 
fprintf(1, 'using find takes %.2f sec\n', toc); 

輸出:

using find takes 0.63 sec 

這種方法的一大優點是,您不需要在各個稀疏數組中有相同數量的列......它將全部通過sparse命令整理出來,它將簡單地將缺失的列視爲全零。

+0

那麼你仍然建議使用vertcat或找到? – AlanH 2013-03-14 21:20:51

+1

''find'方法(和我用'[是{:}]'做的隱式'horzcat')似乎相當有效。您可能會問自己如何生成原始(源)稀疏矩陣;如果你以'(i,j,s)'格式開頭,你可能不需要中間的'find'步驟... – Floris 2013-03-14 21:23:43

+0

在for循環的第一行中,你的意思是'n-ii '?'jj'沒有定義? – AlanH 2013-03-14 21:50:32