2016-10-21 9 views
1

H_sparse은 크기가 20,000 x 5,000 인 큰 매트릭스입니다. 아래 코드의 행렬 벡터 제품 dk = A * Del_H;은 시간이 오래 걸립니다. 이 코드의 속도를 높이려면 어떻게해야합니까?for-loop 코드의 속도를 높이는 방법 (대형 행렬`H_sparse`)?

이 코드는 MATLAB의 내장 함수 pinv(H_Sparse)과 동일한 결과를 얻는 또 다른 방법입니다. 저는 MATLAB이 pinv에 mex 파일과 bsxfun을 사용한다고 생각합니다. 이론 아래 알고리즘

그러나 는 빠르다 :

function PINV_H_Spp = Recur_Pinv_Comp(H_Sparse) 
     L   = 1; 
     H_candidate = H_Sparse(:,L); 
     A   = pinv(H_candidate); 
     for L = 1:size(H_Sparse, 2) - 1 
      L = L + 1; 
      Del_H = H_Sparse(:,L); 
      dk = A * Del_H; 
      Ck =  Del_H - H_candidate * dk; 
      Gk = pinv(Ck); 
      A  = A - dk * Gk; 
      A(end+1,:) = Gk; 
      H_candidate(:,end+1) = Del_H; 
     end 
     PINV_H_Spp = A; 

코드는 샘플 데이터로 H_Sparse = rand(20000, 5000)를 사용 pinv(H_Sparse)와 비교 될 수있다. 개선

답변

1

몇 가지 포인트 :

  • 당신은 2:size(H_Sparse, 2)에 루프 인덱스를 변경하고 라인 L = L + 1;을 제거 할 수 있습니다.
  • 별도의 변수 H_candidate을 만들 필요가 없습니다. 이는 단지 H_Sparse의 파티션이기 때문입니다. 대신, 단지 indexH_sparse 따라서 적절히 저장하면됩니다.
  • 매트릭스를 A 행 단위로 작성하는 대신 preallocate 행을 입력하고 indexing을 사용하여 업데이트 할 수 있습니다. 이것은 보통 약간의 속도 향상을 제공합니다.
  • 출력으로 A을 반환하십시오. 다른 변수에 넣을 필요가 없습니다. 여기

위의 개선 통합 코드의 새로운 버전입니다 : 또한

function A = Recur_Pinv_Comp(H_Sparse) 
    [nRows, nCols] = size(H_Sparse); 
    A = [pinv(H_Sparse(:, 1)); zeros(nRows-1, nCols)]; 
    for L = 2:nCols 
    Del_H = H_Sparse(:, L); 
    dk = A(1:L-1, :)*Del_H; 
    Ck = Del_H - H_Sparse(:, 1:L-1)*dk; 
    Gk = pinv(Ck); 
    A(1:L-1, :) = A(1:L-1, :) - dk*Gk; 
    A(L, :) = Gk; 
    end 
end 

을, 당신이 그들을 대체 할 수 있습니다, 그래서 오직, 열 벡터에서 작동 pinv에 통화처럼 보인다 array transpose을 사용하고 벡터의 제곱의 합으로 비율을 조정하면 (좀 더 속도가 빨라질 수 있습니다)

Gk = Ck.'./(Ck.'*Ck);