我有100个大小为 N-by-N 的稀疏矩阵,其中N=65536
。
他们在对角线附近有大约5.5M非零元素(N ^ 2的0.13%)。
它们存储在单元格数组S{1}, ... , S{100}
中,我想计算总和S{1}+...+S{100}
。
Sum=sparse(N,N);
for i=1:100
Sum=Sum+S{i};
end
以上for
循环代码大约需要25秒。有没有办法优化这段代码?
答案 0 :(得分:2)
这不使用循环,也避免将矩阵转换为完整:
[ii, jj, vv] = find(vertcat(S{:})); % concatenate matrices vertically.
% Get nonzero values (vv) with their row (ii) and column (jj) indices
ii = mod(ii-1, N) + 1; % convert ii to original row indices
Sum = sparse(ii, jj, vv); % this automatically adds values at the same ii, jj