비슷한 질문이 있습니다. Matlab이 다음을 최적화하지 않습니까?
그러나 이것은 더 어려운 변형이며 해결책이 작동하지 않는다고 제안했습니다.
나는 매우 긴 행렬 nxr V, 매우 긴 행렬 W nxs 및 희소 한 행렬 A rxs를 가지고 있습니다 (그러나 차원이 매우 큽니다).
다음이 Matlab에 의해 최적화 될 것으로 예상했기 때문에 메모리 문제가 발생하지 않습니다.
A./(V'*W)
그러나 메모리 부족 문제가 발생했기 때문에 Matlab이 실제로 전체 V '* W 행렬을 생성하려고 시도하는 것 같습니다. 이것을 극복 할 방법이 있습니까? A의 많은 값이 0이기 때문에 모든 V '* W를 계산할 필요가 없습니다.
가능하다면 한 가지 방법은 A (find (A)) ./ (V '* W) (find (A));
그러나 먼저 계산하고 변수에 넣지 않고는 행렬의 하위 집합 (이 경우 V '* W)을 선택할 수 없습니다.
(이전 질문과의 주요 차이점 : V와 W는 단순한 벡터가 아니라 행렬입니다.)
대답 이전 질문은의 제로가 아닌 값을 계산하는 일반화 될 수 A./(V'*W)
는 다음과 같이를 :
[ii jj Anz] = find(A);
result = arrayfun(@(n) Anz(n) / ( V(:,ii(n))'*W(:,jj(n)) ), 1:length(ii) );
이것은 한 번에 하나씩 V'*W
해당 행렬의 필요한 항목 (즉, 해당 항목 A
이 0이 아닌 항목) 만 계산하기 때문에 전체 행렬 계산을 방지 합니다 . 따라서 메모리 사용량은 낮게 유지됩니다. 속도에 관해서 arrayfun
는 일반적으로 사용 이 느리지 만 A
0이 아닌 값이 거의 없으면 오래 걸리지 않습니다.
물론 희소 행렬 A./(V'*W)
을 sparse(ii,jj,result)
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다