我的目標是將許多稀疏矩陣組合在一起形成一個大的稀疏矩陣。我能想到的唯一兩個想法是(1)創建一個大的稀疏矩陣並覆蓋某些塊,(2)單獨創建塊使用vertcat
來形成我的最終稀疏矩陣。但是,我讀過overwriting稀疏矩陣效率很低,而且我也讀過vertcat並不是完全有效的計算。 (我並沒有考慮使用for循環,因爲它們效率低下)。如何有效地組合垂直稀疏矩陣
那麼我還有其他的替代方案嗎?
編輯:通過結合我的意思是「膠合」矩陣(垂直),元素不會相互作用。
我的目標是將許多稀疏矩陣組合在一起形成一個大的稀疏矩陣。我能想到的唯一兩個想法是(1)創建一個大的稀疏矩陣並覆蓋某些塊,(2)單獨創建塊使用vertcat
來形成我的最終稀疏矩陣。但是,我讀過overwriting稀疏矩陣效率很低,而且我也讀過vertcat並不是完全有效的計算。 (我並沒有考慮使用for循環,因爲它們效率低下)。如何有效地組合垂直稀疏矩陣
那麼我還有其他的替代方案嗎?
編輯:通過結合我的意思是「膠合」矩陣(垂直),元素不會相互作用。
根據MATLAB的幫助下,你可以在「拆解」的稀疏矩陣
[i,j,s] = find(S);
這意味着,如果你有兩個矩陣S
和T
,並且希望(有效)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
命令整理出來,它將簡單地將缺失的列視爲全零。
如果你只是將它們加在一起會發生什麼?更具體地說 - 矩陣的維度是什麼,書中的「組合」矩陣是什麼樣的?你能舉一個玩具的例子嗎? – Floris 2013-03-14 20:43:07
@佛羅里達尺寸範圍可以從2×2到2^18×2^18,或者Matlab可以爲我的腳本處理的最大值。我認爲在2^18左右會產生一個錯誤。玩具的例子可以是任意的。我的矩陣中唯一固定的是第一個也是最後一個塊,它們是'speye',但是它們之間的所有內容都不相同(儘管它們的大小是固定的) – AlanH 2013-03-14 21:18:01
@Floris也不能添加它們b/c我不能找出適用於所有矩陣的全局索引。我只是看到了你的帖子,所以我不認爲這會是問題。 – AlanH 2013-03-14 21:19:26