根据 Matlab 帮助文档,您可以使用以下代码“分解”稀疏矩阵:
[i,j,s] = find(S)
这意味着如果你有两个矩阵S
和T
,并且你想要(有效地)将它们垂直连接起来,你可以这样做:
[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倍。你认为垂直拼接很慢是什么原因?
编辑2:假设您需要对“许多”稀疏矩阵执行此操作,则以下方法可行(假设您希望将它们全部“放在同一位置”):
m = 1000; n = 2000; density = 0.01;
N = 100;
Q = cell(1, N);
is = Q;
js = Q;
ss = Q;
numrows = 0;
for ii = 1:N
Q{ii} = sprandn(m+ii, n-jj, density);
[a b c] = find(Q{ii});
sz = size(Q{ii});
is{ii} = a' + numrows; js{ii}=b'; ss{ii}=c';
numrows = numrows + sz(1);
end
tic
ST = sparse([is{:}], [js{:}], [ss{:}]);
fprintf(1, 'using find takes %.2f sec\n', toc);
输出:
using find takes 0.63 sec
这种方法的最大优点是你不需要在个别稀疏数组中拥有相同数量的列...这将由命令自动解决,它会将缺失的列视为全部为零。
speye
,但是中间的所有内容都不同(尽管它们的大小是固定的)。 - TheRealFakeNews