matlabのヘルプによると、スパース行列を「逆アセンブル」できます
[i,j,s] = find(S);
これは、2 つの行列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
不足している列がすべてゼロであると単純に見なすコマンドによってすべてがソートされます。