【问题标题】:matlab: extract block diagonals of large sparse matrixmatlab:提取大型稀疏矩阵的块对角线
【发布时间】:2012-03-11 23:36:53
【问题描述】:

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

【问题讨论】:

  • @MitchWheat - 我建议你下次读得慢一点:问题在第 2 行:“我该怎么做?”,然后是附录 :)
  • 我建议您在适当的论坛上提问。
  • @MitchWheat - 似乎我得到了一个很好的答案,但如果有更好的论坛来解决这类问题,我很乐意在未来发布。那是哪个论坛?

标签: matlab sparse-matrix


【解决方案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 大小 --> 0.00135 秒 6 大小 --> 0.00014 秒 9 大小 --> 0.00013 秒 12 大小 --> 0.00014 秒 15 大小 --> 0.00015 秒 615 大小 --> 0.00392 秒 1215 大小 --> 0.00874 秒 1815 大小 --> 0.01537 秒 2415 大小 --> 0.02570 秒 3015 大小 --> 0.03595 秒 3615 大小 --> 0.05007 秒 4215 大小 --> 0.06420 秒 4815 大小 --> 0.08690 秒 5415 大小 --> 0.10077 秒 6015 大小 --> 0.13322 秒 6615 大小 --> 0.14923 秒 7215 大小 --> 0.17562 秒 7815 大小 --> 0.37371 秒 8415 大小 --> 0.23060 秒

【讨论】:

  • 你完全理解 :) 这正是我想要的,谢谢!
猜你喜欢
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-09
  • 2012-01-10
  • 1970-01-01
  • 2012-09-04
相关资源
最近更新 更多