2016-08-23 2 views
0

특정 가중치 합계를 벡터화하려고했지만 그 방법을 알 수 없습니다. 아래에 간단한 간단한 작업 예제를 만들었습니다. 나는 해결책이 bsxfun 또는 reshape와 kronecker 제품을 포함한다고 생각하지만, 나는 여전히 그것을 작동시키지 못했다.가중치 합계 벡터화 벡터화

rng(1); 
N = 200; 
T1 = 5; 
T2 = 7; 

A = rand(N,T1,T2); 
w1 = rand(T1,1); 
w2 = rand(T2,1); 

B = zeros(N,1); 

for i = 1:N 
for j1=1:T1 
for j2=1:T2 
    B(i) = B(i) + w1(j1) * w2(j2) * A(i,j1,j2); 
end 
end 
end 

A = B; 

답변

3

는이 작업을 수행하기 위해 bsxfun, reshapepermute의 조합을 사용할 수 있습니다.

우선 permute을 사용하여 N 치수를 A의 3 차원으로 이동하십시오. 그런 다음 w1과 전치 코드 w2을 곱하여 가중치 표를 만듭니다. 다음으로 bsxfun을 사용하여이 그리드와 각 "슬라이스"간의 요소 - 와이즈 곱셈 (@times)을 A으로 수행 할 수 있습니다. 그런 다음 3D 결과를 M × N으로 재구성하고 첫 번째 차원에서 합계를 계산할 수 있습니다.

B = sum(reshape(bsxfun(@times, w1 * w2.', permute(A, [2 3 1])), [], N)).'; 

업데이트 당신을 위해 요약을 수행하는 행렬 곱셈을 사용하는 것이 더 간단한 방법이 실제로있다

. 그것은 불행하게도

% Create the grid of weights 
W = w1 * w2.'; 

% Perform matrix multiplication between a 2D version of A and the weights 
B = reshape(A, N, []) * W(:); 

로 분리 할 수있다 또는 당신은 무게의 평평한 그리드 만들 kron을 사용할 수

B = reshape(A, N, []) * kron(w2, w1); 
+0

와우. 그것은 빨랐다. 이것은 완벽하게 작동합니다. 나는 bsxfun을 사용하려고 시도했지만 모양을 변경하지는 않았다. 고마워요! 나는 단지 6 분 만에 답을 수락 할 수있다. – phdstudent

+0

나는 약간의 질문을 편집했다. 대답은 3 차원 합계에 대해 쉽게 일반화 될 수 있습니까? – phdstudent

+0

@volcompt이 솔루션은 2D 가중치 질문에 적합하지만 3D 질문은 다른 짐승처럼 보입니다. 새로운 질문으로 이것을 받아들이는 것이 가장 좋습니다 (http://meta.stackexchange.com/a/43485/318672). – Suever