0
我有一个大型稀疏矩阵A
,我想创建一个3X3块对角线A的稀疏矩阵。我该怎么做?请记住,A
非常大且稀疏,所以任何使用迭代的方法都会很慢,并且任何使用某些创建完整(而不是稀疏)矩阵的方法的方法都会占用太多内存。matlab:提取大型稀疏矩阵的块对角线
我有一个大型稀疏矩阵A
,我想创建一个3X3块对角线A的稀疏矩阵。我该怎么做?请记住,A
非常大且稀疏,所以任何使用迭代的方法都会很慢,并且任何使用某些创建完整(而不是稀疏)矩阵的方法的方法都会占用太多内存。matlab:提取大型稀疏矩阵的块对角线
如果我理解正确的话,这里是一些代码(见%%%%%%%%%%%
线之间的部分。尽管for
环路下面是时序结果,这似乎是合理的给我。唯一的问题是使用spalloc功能,这你可能需要调整您的应用程序
for N= [(3:3:12) (15:600:9000)]
bigsparse = sprand(N,N,0.1);
tic;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
origSize = size(bigsparse);
diagSize = 3;
numDiags = size(bigsparse,1)/diagSize;
assert(numDiags == floor(numDiags))
bigsparse_diagonals = spalloc(origSize(1), origSize(2), ceil(prod(origSize)*0.1));
for ix=(1:numDiags)-1
ixsCurrent = ix*diagSize+[1:diagSize];
bigsparse_diagonals(ixsCurrent,ixsCurrent) = ...
bigsparse(ixsCurrent,ixsCurrent);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
fprintf(1,'%5d size --> %6.5f seconds \n', N, toc)
end
时序结果(注意,它实际上需要很多时间来生成随机测试矩阵,而不是做重新格式化):
3 size --> 0.00135 seconds 6 size --> 0.00014 seconds 9 size --> 0.00013 seconds 12 size --> 0.00014 seconds 15 size --> 0.00015 seconds 615 size --> 0.00392 seconds 1215 size --> 0.00874 seconds 1815 size --> 0.01537 seconds 2415 size --> 0.02570 seconds 3015 size --> 0.03595 seconds 3615 size --> 0.05007 seconds 4215 size --> 0.06420 seconds 4815 size --> 0.08690 seconds 5415 size --> 0.10077 seconds 6015 size --> 0.13322 seconds 6615 size --> 0.14923 seconds 7215 size --> 0.17562 seconds 7815 size --> 0.37371 seconds 8415 size --> 0.23060 seconds
你完全理解:)那正是我所要找的,谢谢! – olamundo 2012-03-12 13:50:56
@MitchWheat - 我建议你阅读更慢Ÿ下次:问题是在第二行:“我将如何做到这一点?”,其次是一个附录:) – olamundo 2012-03-11 14:40:32
我建议你在适当的论坛上提问你的问题。 – 2012-03-11 23:32:37
@MitchWheat - 似乎我得到了一个很好的答案,但如果这类问题有更好的论坛,我很乐意在未来发布。那是哪个论坛? – olamundo 2012-03-12 13:50:15