2012-03-11 7 views
0

큰 희소 행렬 A을 가지고 있으며, A의 3X3 블록 대각선의 희소 행렬을 만들고 싶습니다. 어떻게해야합니까? A은 매우 크고 스파 스 (sparse)하므로 반복을 사용하는 모든 메서드가 느려지고 전체 (희소성이없는) 행렬을 만드는 일부 메서드를 사용하는 메서드는 너무 많은 메모리를 차지합니다.matlab : 대용량 희소 행렬의 블록 대각선을 추출하십시오.

+1

@MitchWheat을 - 나는 더 느린 것을 권 해드립니다. 다음 번에 질문 : 두 번째 줄에 질문이 있습니다 : "어떻게해야합니까?"다음에 부록이 있습니다. – olamundo

+0

적절한 포럼에서 질문하는 것이 좋습니다. –

+0

@MitchWheat - 좋은 대답을 얻은 것처럼 보이지만, 이런 유형의 질문에 대한 더 나은 포럼이 있다면 장래에 기꺼이 게시 할 것입니다. 어떤 포럼입니까? – olamundo

답변

1

나는 여기에 몇 가지 코드합니다 (%%%%%%%%%%% 라인 사이의 부분을보고는, 제대로 이해하고. 아래는 for 루프에도 불구하고 나에게 합리적인 보이는 결과를, 타이밍. 유일한 트릭은 SP_Alloc로 기능의 사용 인 . 당신이 당신의 응용 프로그램에 대해 조정할 수있다

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

관련 문제