我有一个MxM
矩阵S
,其条目在对角线上为零,在其他地方为非零。我需要制作一个更大的块矩阵。这些块的大小为NxN
,并且会有MxM
个。
(i,j)th
阻止将是S(i,j)I
,其中I=eye(N)
是NxN
身份。此矩阵肯定是稀疏的,S
具有M^2-M
非零条目,我的块矩阵将N(M^2-M)
(NM)^2
或1/N
%非零条目,但我将它添加到另一个我不希望稀疏的NMxNM
矩阵中。
由于我将把块矩阵添加到一个完整的矩阵中,因此尝试在稀疏的代码中编写代码会增加速度。方式?我一直在来回,但我的想法正在解决:即使我将S
转换为稀疏块矩阵的代码也不是非常有效,当我告诉它添加时一个完整的稀疏矩阵,MATLAB不知道它只需要迭代非零元素吗?我已经接受过训练,for
循环在MATLAB中很慢,像repmat
这样的东西和用零填充更快,但我猜想最快的事情就是不要建立完全阻塞矩阵,但写代码以稀疏的方式将(小矩阵)S
的条目添加到我的另一个(大的,完整的)矩阵。如果我要学习如何使用稀疏代码构建块矩阵(比完全构建它并将其传递给sparse
更快),那么该代码应该能够以稀疏的方式为我添加甚至不需要构建块矩阵吗?
答案 0 :(得分:1)
如果你可以在内存中保留一个完整的NMxNM矩阵,就不必担心稀疏操作。事实上,在大多数情况下,A + B,A满和B稀疏,需要比A + B更长的时间,其中A和B都是满的。
答案 1 :(得分:1)
如果您要将稀疏矩阵A添加到完整矩阵B,结果已满,并且几乎可以肯定A稀疏没有优势。
例如: n = 12000; A = rand(n,n); B1 = rand(n,n); B2 = spalloc(n,n,n * n); B2尽可能地稀疏,也就是说,它全是零! 在我的机器上,A + B1大约需要0.23秒,而A + B2需要大约.7秒。
基本上,对完整矩阵的操作使用疯狂优化的BLAS / LAPACK库调用。与稀疏相关联的开销会使事情变得更糟,除非您处于稀疏超级有用的特殊情况。
当矩阵的大小表明某些算法应该非常慢时,稀疏是非常有用的,但由于稀疏性(+可能是特殊的矩阵结构),所需的实际计算次数要少几个数量级。
示例:求解线性系统A * x = b其中A是块对角矩阵: As =稀疏(rand(5,5)); for(i = 1:999)As = blkdiag(As,稀疏(rand(5,5))); end%生成一个5x5块的5000x5000稀疏块对角矩阵
Af =满(As); b = rand(5000,1);
在我的机器上,解决整个矩阵上的线性系统(即Af \ b)需要大约2.3秒,而As \ b需要.0012秒。
稀疏可以很棒,但它只对你可以巧妙利用结构的大问题有帮助。