2013-11-01 8 views
3

저는 Matlab에 3 개의 행렬을 가지고 있는데, A는 n x m이고, B는 p x m이고 C는 r x n입니다. Matlab에서 다음과 같이 빠르게 할 수 있습니까?

우리가 사용하는 몇 가지 행렬을 초기화하는 말 :

A = rand(3,4); 
    B = rand(2,3); 
    C = rand(5,4); 

다음 두 가지가 동일합니다

>> s=0; 
>> for i=1:3 
     for j=1:4 
      s = s + A(i,j)*B(:,i)*C(:,j)'; 
     end; 
    end 
>> s 

s = 

2.6823 2.2440 3.5056 2.0856 2.1551 
2.0656 1.7310 2.6550 1.5767 1.6457 


>> B*A*C' 

ans = 

2.6823 2.2440 3.5056 2.0856 2.1551 
2.0656 1.7310 2.6550 1.5767 1.6457 

후자의 것을 훨씬 더 효율적입니다. 추가되는 행렬의 각 단계 후에 그 값의 합으로 정규화되고, 여기서

s=0; 
for i=1:3 
     for j=1:4 
      x = A(i,j)*B(:,i)*C(:,j)'; 
      s = s + x/sum(sum(x)); 
     end; 
end 

:

I는 루프의 다음 변형 예에 대한 효율적인 버전을 찾을 수 없다.

이 아이디어를 어떻게 위의 행렬 곱셈과 같이 효율적으로 만들 수 있습니까? 아마 accumarray가 도움이 될지도 모른다고 생각했지만 어떻게 확신 할 수 없었습니다.

답변

3

당신은 bsxfun와 효율적으로 수행 할 수 있기 때문에 정상화의 결과는 A의 독립적 인 것을

aux1 = bsxfun(@times, permute(B,[1 3 2]), permute(C,[3 1 4 2])); 
aux2 = sum(sum(aux1,1),2); 
s = sum(sum(bsxfun(@rdivide, aux1, aux2),3),4); 

참고, 그것이 않는 경우 결과가 (어떤 제로 항목을 포함하지 않는 가정 정의되지 않음).

관련 문제