Performance MATLAB稀疏性-在我的情况下有速度优势吗?

Performance MATLAB稀疏性-在我的情况下有速度优势吗?,performance,matlab,sparse-matrix,Performance,Matlab,Sparse Matrix,我有一个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转换

我有一个
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难道不知道它只需要迭代非零元素吗?我接受过培训,在MATLAB中,
for
循环速度很慢,类似于
repmat
和用零填充的速度更快,但我猜最快的方法是根本不构建块矩阵,而是编写代码,将(小矩阵)
S
的条目添加到我的另一个(大的、完整的)中矩阵以稀疏的方式。如果我要学习如何使用稀疏代码构建块矩阵(比以完整方式构建块矩阵并将其传递给
sparse
)更快),那么该代码应该能够以稀疏方式为我进行加法,而无需构建块矩阵,对吗?

如果您可以在内存中保留完整的NMxNM矩阵,不要为稀疏操作操心。事实上,在大多数情况下,A+B(完全和B稀疏)将比A+B(其中A和B都是完全的)花费更长的时间

根据您的描述,对于您的问题,使用稀疏可能较慢: 如果将稀疏矩阵a添加到完整矩阵B,则结果是完整的,几乎可以肯定使用稀疏矩阵a没有任何好处

例如: n=12000;A=兰特(n,n);B1=兰特(n,n);B2=沥青(n,n,n*n); B2尽可能稀疏,也就是说,它都是零! 在我的机器上,A+B1大约需要.23秒,而A+B2大约需要.7秒

基本上,对完整矩阵的操作使用经过疯狂优化的BLAS/LAPACK库调用。与稀疏相关的开销会让事情变得更糟,除非你在特殊情况下,稀疏非常有用

什么时候稀疏超级有用? 当矩阵的大小表明某些算法应该非常慢时,稀疏非常有用,但由于稀疏性(+可能是特殊的矩阵结构),所需的实际计算数量要少几个数量级

示例:求解线性系统A*x=b,其中A是块对角矩阵: As=稀疏(rand(5,5));对于(i=1:999)As=blkdiag(As,稀疏(rand(5,5)));end%生成一个由5x5个块组成的5000x5000稀疏块对角矩阵

Af=满(As); b=兰特(5000,1)

在我的机器上,求解完整矩阵(即Af\b)上的线性系统大约需要2.3秒,而As\b需要0.0012秒


稀疏可能非常棒,但它只对可以巧妙利用结构的大型问题有用。

有多大
N
M
?(注意:我认为您将有
N*(M^2-M)
非零条目,而不是
M^2-M
)如果只有对角线是零,那么这不是非常稀疏的。稀疏矩阵有一个额外的开销,在这种情况下会导致它需要更多的内存。建议您需要在稀疏矩阵的25%以下进行分配,才能看到性能的改善。但在现实中,我认为唯一能确定它是否会对你的情况产生影响的方法是实现你正在运行的任何算法的最小版本并计时。在不知道你在矩阵上执行的确切操作的情况下,我认为我们不可能提供一个结论性的答案。正如他们在这里已经说过的:如果你的非零数量大于25%的条目,不要麻烦使用稀疏。@BillBokeey Ohp。。。你说得对
S
具有
M^2-M
非零项,它将与我的新矩阵的非零项对应1到N。起初,我希望能够处理多达
N~1000
M~10000
,但快速计算表明,我的完整
NMxNM
矩阵将有
1e14
项,即
~100 TB