Как получить среднее значение весовых матриц без цикла?

У меня есть группы скаляров и матриц соответственно:

w1, w2...wn
A1, A2... An

Как получить

w1*A1 + w2*A2 + ... + wn*An

без петли? И как эффективно получить

w1*(b1*c1) + w2*(b2*c2) + ... + wn*(bn*cn)

куда bi а также ci векторы, но bi*ci матрица, а не скаляр?

2 ответа

Решение

редактировать: у меня есть лучшее решение.

Если ваши матрицы An хранятся в трехмерной матрице размера P x Q x N такой, что An = A(:,:,n) за n = 1, 2, ..., N и ваши веса хранятся в векторе веса w размера 1 x N тогда следующая команда делает средневзвешенное значение:

B = reshape(w*reshape(permute(A,[3,1,2]),N,[]),[P,Q]);

Первая проблема может быть решена bsxfun следующее:

% create matrices
a=[1 2]
b=randi(9,[3 3 2])

% now you will have to reshape a, so that its non-singleton dimensions match b
% i.e. a is 1 x 2 and b is 3 x 3 x 2, so second dimension of (=2) should match 
% 3rd dimension of b (=2). Thus a should be of shape `1 x 1 x 2`. Then you can 
% multiply using bsxfun and sum along 3rd dimension as follows

sum(bsxfun(@times, permute(a,[3 1 2]), b),3)
Другие вопросы по тегам