2012-03-11 116 views
0

我有一个大型稀疏矩阵A,我想创建一个3X3块对角线A的稀疏矩阵。我该怎么做?请记住,A非常大且稀疏,所以任何使用迭代的方法都会很慢,并且任何使用某些创建完整(而不是稀疏)矩阵的方法的方法都会占用太多内存。matlab:提取大型稀疏矩阵的块对角线

+1

@MitchWheat - 我建议你阅读更慢Ÿ下次:问题是在第二行:“我将如何做到这一点?”,其次是一个附录:) – olamundo 2012-03-11 14:40:32

+0

我建议你在适当的论坛上提问你的问题。 – 2012-03-11 23:32:37

+0

@MitchWheat - 似乎我得到了一个很好的答案,但如果这类问题有更好的论坛,我很乐意在未来发布。那是哪个论坛? – olamundo 2012-03-12 13:50:15

回答

1

如果我理解正确的话,这里是一些代码(见%%%%%%%%%%%线之间的部分。尽管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 
+0

你完全理解:)那正是我所要找的,谢谢! – olamundo 2012-03-12 13:50:56