matlab:提取大稀疏矩阵的块对角线

时间:2012-03-11 13:30:19

标签: matlab sparse-matrix

我有一个大的稀疏矩阵A,我想创建一个AX的3X3块对角线的稀疏矩阵。我该怎么做?请记住,A非常大且稀疏,因此任何使用迭代的方法都会很慢,并且任何使用创建完整(而非稀疏)矩阵的方法的方法都会占用太多内存。 / p>

1 个答案:

答案 0 :(得分: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