Суммируйте и умножайте матрицы разного размера - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть две матрицы в Matlab: A размера GxM и B размера DxM. Я хочу создать матрицу C размера GxD такую, что C(g,d)=sum(A(g,:).*B(d,:))/M.

Позвольте мне объяснить лучше на примере

clear
A=[1  2  3;
   4  5  6;
   7  8  9;
   10 11 12]; %GxM

B=[14 15 16;
   17 18 19]; %DxM

G=size(A,1);
D=size(B,1);
M=size(A,2);

Матрица C может быть получена следующим образом:

C=zeros(G,D);
for g=1:G
    for d=1:D
        C(g,d)=sum(A(g,:).*B(d,:))/M;
    end
end

Я хочу избежать этого двойного цикла, потому что мой код использует матрицы гораздо больших измерений. Не могли бы вы предложить что-нибудь векторизованное?

1 Ответ

0 голосов
/ 01 сентября 2018

Вы можете использовать крайнюю форму векторизации, потому что то, что у вас есть, это в основном матричный продукт. Чтобы увидеть это, рассмотрим

C(i,j) = sum_k A(i,k)*B(j,k)/M = 1/M * sum_k A(i,k)*B(j,k),

определяя транспонирование B как Bt, мы имеем

C(i,j) = 1/M * sum_k A(i,k) * Bt(k,j)

где сумма по определению является (i,j) элементом матричного произведения A * Bt. Другими словами, вам нужно

C = (A * B.')/M;

Используя ваш пример входных данных и вычислений C2 в соответствии с приведенным выше:

>> C

C =

   30.6667   36.6667
   75.6667   90.6667
  120.6667  144.6667
  165.6667  198.6667

>> C2

C2 =

   30.6667   36.6667
   75.6667   90.6667
  120.6667  144.6667
  165.6667  198.6667
...