2013-11-01 3 views
7

매우 긴 벡터 1xr v과 매우 긴 벡터 w 1xs 및 매트릭스가 A rxs입니다 (스파 스하지만 크기는 매우 큽니다).Matlab은 다음을 최적화하지 않습니까?

내가 matlab에 최적화 될 다음 그래서 메모리 문제로 실행되지 않습니다 기다리고 있었다 : 나는 때문에, 매트랩 실제로 전체 v'*w 매트릭스를 생성하기 위해 노력하고있다처럼

A./(v'*w) 

하지만이 보인다 메모리 부족 문제가 발생했습니다. 이것을 극복 할 수있는 방법이 있습니까? A의 값은 0이기 때문에 모두 v'*w을 계산할 필요가 없습니다.

편집 :이 방법을 사용할 수 있다면, 한 가지 방법은 A(find(A))./(v'*w)(find(A));

을하는 것입니다 할 수 있습니다하지만 당신은 먼저 계산에 넣어없이 매트릭스 (이 경우 v'*w)의 부분 집합을 선택할 수 없습니다 변수.

+1

['spfun'] (http://www.mathworks.com/help/matlab/ref/spfun.html) - "제로가 아닌 스파 스 행렬 요소로 기능을 적용" –

+0

음 ... spfun은 좋은 리드 일지 모르지만이 경우에는 어떻게 사용하는지 잘 모르겠습니다. 첫째, 평가 된 함수는 그것이 적용된 행렬 셀의 인덱스를 인식하지 못합니다. – kloop

답변

6
  • bsxfun을 사용할 수 있습니다. 이 행렬 v.'*w를 생성하지 않고 A./(v'*w)와 같은 결과를 보여줍니다

    bsxfun(@rdivide, bsxfun(@rdivide, A, v'), w) 
    
  • 또 다른 가능성 : 만 사용 영이 아닌 값을 원하는 경우 :

    [ii jj Anz] = find(A); 
    Anz./v(ii)'./w(jj).' 
    

    이 당신의 A(find(A))./(v'*w)(find(A))에 해당하는 열 벡터를 제공합니다 다시 v.'*w을 생성하지 않고. 스파 스 매트릭스 A./(v'*w) (0이 아닌 값의 열 벡터 인 경우) 대신 sparse(ii,jj,Anz./v(ii)'./w(jj).')을 사용해야합니다.

당신은 아마 대신 사용할
+0

다른 'rdivide'답변! 아주 좋아. 그러나 메모리 문제로 인해 0이 아닌 솔루션이 필요할 수도 있지만, 다시 말하면 내가 본 내용을 다시 정리했습니다. – chappjc

+0

@chappjc 네,'bsxfun'에 대해 배웠기 때문에 나는 모든 것에 그것을 적용하는 경향이 있습니다 :-) 나는 용어를 재정렬하는 것에 관해 당신의 요점을 얻지 못합니다. –

+0

kloop은'(v '* w)'그룹화되어 있습니다 만, 그들을 순차적으로. 언뜻 나는 이해하지 못했던 문제의 본질 일뿐입니다. 결과적으로, 대답은'5.8208e-11'에 의한 참조와 실제로 다르다. 나는 기계의 정밀도 오차가 누적되었지만 여전히 작다. – chappjc