2012-03-11 19 views
0

私は大きな疎行列Aを持っており、Aの3X3ブロック対角の疎行列を作成したいと思います。 Aは非常に大きく、スパースなので、反復を使用するメソッドはすべて遅くなり、完全な(疎ではない)マトリックスを作成するメソッドを使用するメソッドは、あまりにも多くのメモリを占有します。matlab:大規模な疎行列のブロック対角を抽出する

+1

@MitchWheat - Iあなたはもっとゆっくりと読むことをお勧めします次の時間:質問は2行目にあります:「どうすればいいですか?」、補足が続きます。 – olamundo

+0

あなたは適切なフォーラムで質問をすることをお勧めします。 –

+0

@MitchWheat - 私は良い答えがあるようですが、このタイプの質問のためのより良いフォーラムがあるなら、私は将来そこに喜んで投稿します。それはどのフォーラムですか? – olamundo

答えて

1

私が正しく理解していれば、ここにいくつかのコードがあります(%%%%%%%%%%%の部分を見てください)。forループがあるにもかかわらず、私には妥当と思われるタイミングの結果があります。あなたは、あなたのアプリケーション用にチューニングするために持っていること(再フォーマットを行うことよりも、それが実際にランダムなテスト行列を生成するために多くの時間がかかります注)

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

関連する問題