2013-11-21 3 views
0

배열을 AB 요소로 곱하고 첫 번째 차원의 합계를 계산 한 다음 결과를 C으로 반환해야합니다. AN -by-M -by-L 매트릭스입니다. BN -by-1 -by-L 매트릭스입니다. NM30보다 작지만 L은 매우 큽니다. 내 코드 :matlab에서이 루프를 더 빠르게 만드는 방법

C=zeros(size(B)); 
parfor i=1:size(A,2) 
    C(i,1,:) = sum(bsxfun(@times, A(:,i,:), B(:,1,:)), 1); 
end 

문제는 코드가 느리며 누구나 코드를 빨리 작성할 수 있습니까? 고맙습니다.

답변

0

방법이의 라인을 따라 뭔가에 대해 :

C = permute(sum(A.*repmat(B,1,M)),[2,1,3]); 

이 내 PC까지의 계산 속도의 배 ~ 4. 흥미롭게도, 실제로는 parfor 루프를 for 루프로 변경하여 계산을 2 배 (실제로는 PC에서) 빠르게 할 수 있습니다. 나는 이것이 가장 빠른 생각

C=reshape(sum(bsxfun(@times, A, B), 1), size(B)) 

: 루이스 Mendo의 의견을 복용

+1

그것은 요소 경우 비 공역 전치을''.'''해야한다 복잡하다. –

+0

실제로 트랜스 포즈는 3D 행렬에 정의되어 있지 않으므로 트랜스 포즈는 전혀 필요하지 않습니다. Permute가 더 좋은 아이디어이며, 성능에 전혀 영향을 미치지 않는 것 같습니다. – MrAzzaman

0

,이 명령을 사용하여 제안한다. 만약 내가 제대로 이해하고

+0

저는 이것이 무엇을 제안했는지와 거의 같다고 생각합니다.하지만 그 일이 무엇이 일어나는지에 대해서는 명확하지 않습니다. 나는 후드 아래에서 MATLAB이 bsxfun으로 요소 - 와이즈 곱셈과 똑같은 일을하고 있으며, 순열/변형의 차이가 머리카락을 나누는 것임을 확신합니다. – MrAzzaman

+1

왜'repmat'인가? 'bsxfun'은 자동적으로 반복을합니다; 사실 그것은'bsxfun'의 본질입니다. –

0

, 그냥 이렇게 :

C = squeeze(sum(bsxfun(@times, A, B))); 

이 제공 C를 M 사이즈와 X L.

관련 문제