2016-08-23 9 views
0

Я пытался прорисовать определенную взвешенную сумму, но не мог понять, как это сделать. Я создал простой минимальный рабочий пример ниже. Я предполагаю, что решение включает в себя либо продукты bsxfun или reshape, либо kronecker, но мне все еще не удалось заставить его работать.Векторизовать взвешенную сумму matlab

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, reshape и permute для достижения этой цели.

Мы сначала используем permute для перемещения измерения N до 3-го измерения A. Затем мы умножаем w1 и транспонируем w2 для создания сетки весов. Затем мы можем использовать bsxfun для выполнения умножения по элементам (@times) между этой сеткой и каждым «срезом» A. Затем мы можем преобразовать 3D-результат в M x N и суммировать его по первому размеру.

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

Update

Там на самом деле простой подход, который будет использовать умножение матриц для выполнения суммирования для вас. Это, к сожалению, должно быть разбито на

% 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

Wow. Это было быстро. Это прекрасно работает. Я попытался использовать bsxfun и изменить форму, но не понял. Большое спасибо! Я могу принять ответ за 6 минут :) – phdstudent

+0

Я немного изменил вопрос. Легко ли обобщается ответ на трехмерную сумму? – phdstudent

+0

@volcompt Похоже, что это решение хорошо работало для вашего двумерного взвешивающего вопроса, но на самом деле 3D-вопрос - это другой зверь. Лучше всего принять это (если оно работает для вас) и [задать другой вопрос] (http://meta.stackexchange.com/a/43485/318672) с новым вопросом. – Suever

Смежные вопросы