gpt4 book ai didi

matlab - 如何高效地垂直合并稀疏矩阵

转载 作者:太空宇宙 更新时间:2023-11-03 19:43:49 24 4
gpt4 key购买 nike

我的目标是将许多稀疏矩阵组合在一起形成一个大的稀疏矩阵。我唯一能想到的两个想法是 (1) 创建一个大的稀疏矩阵并覆盖某些 block ,(2) 使用 vertcat 单独创建 block 以形成我最终的稀疏矩阵。然而,我读过 overwriting稀疏矩阵效率很低,而且我还读到 vertcat 的计算效率并不高。 (我没有同时考虑使用 for 循环,因为它们效率很低)。

那我还有什么其他选择?

编辑:我所说的结合是指将矩阵“粘合”在一起(垂直),元素不会相互作用。

最佳答案

根据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 命令整理出来,这将只需将缺失的列视为全零即可。

关于matlab - 如何高效地垂直合并稀疏矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15419259/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com