2013-07-23 2 views
0

repmat를 의지하지 않고 '차단'은 행렬 곱셈은 I 및 B (치수 NX1) 벡터 (기준 MXN의) 행렬을 갖는다.하게 Matlab :

_repmat_((A*b),[C 1]) 인 벡터를 만들고 싶습니다. C = n/m입니다. 나는 많은 데이터를 사용하고 있으므로 n ~ 100000 및 C ~ 10.

이 정말 명시 적으로 용이하게 이용 가능한 메모리를 초과 같이 전체 블록 행렬 (치수 NXN )을 생성 할 필요없이 매트릭스 곱셈 블록 볼 수 있듯이.

은 희박하며 이미 _sparse()_ 기능을 사용하여 변환되었습니다.

  1. 더 좋은 방법이 있나요? 내가 elementwise 계산을 수행 한 경우
  2. 보통, 내가 대신 메모리 풋 프린트를 최소화하기 위해 repmat를 사용하는 bsxfun을 사용합니다 (속도와 메모리 풋 프린트 트레이드 오프를 고려하면, 차라리 작은 메모리 풋 프린트이있을 것이다). 내가 아는 한 행렬 곱셈에 상응하는 bsxfun이 없다는 것을 알 수 있습니까?

답변

0

다른 방법으로 궁금해하는 대신 희소 매트릭스를 사용하는 법을 배워야 할 때입니다.

SPARSE 블록 대각 매트릭스는 올바르게 작성하면 많은 메모리를 차지하지 않습니다. 내 blktridiag 함수를 사용합니다. 실제로는 삼중 삼중 행렬 블록을 만듭니다. 여기서는 랜덤 블록 대각 행렬을 만드는 데 사용했습니다. 대각선이 아닌 요소를 0으로 설정 했으므로 블록 대각선이됩니다. 이 작은 것은 아니지만

A = rand(3,3,100000); 
tic,M = blktridiag(A,zeros(3,3,99999),zeros(3,3,99999));toc 
Elapsed time is 0.478068 seconds. 

그리고, 필요한 메모리는 훨씬 더 대각선 eleemnts 자체를 저장하는 데 필요한 두 번 meemory 이상이다.

whos A M 
    Name   Size      Bytes Class  Attributes 

    A    3x3x100000    7200000 double    
    M   300000x300000    16800008 double sparse  

7 메가 바이트에 비해 약 17 메가 바이트입니다.

blktridiag은 명시 적으로 스파 스 매트릭스를 직접 만듭니다.