Как вычислить быстрое внешнее произведение между двумя матрицами в Matlab? - PullRequest
2 голосов
/ 10 января 2012

У меня есть две матрицы размером n на m, A и B.Я хочу создать новую матрицу C, которая будет выглядеть примерно так:

for i = 1:n
    C = C + outerProduct(A(i,:), B(i,:));
end

т.е. C - это матрица размером mxm, сумма всех внешних произведений строк A и B.

Есть ли быстрый способ сделать это без цикла for (учитывая, что циклы for обычно медленны в Matlab)?

Ответы [ 3 ]

3 голосов
/ 10 января 2012

Операция, которую вы выполняете (сумма внешних продуктов строки), эквивалентна умножению транспонированной версии A на B:

C = A.'*B;

Это можно увидеть, используяследующий пример:

>> mat = magic(5);  %# A sample 5-by-5 matrix
>> A = mat(1:4,:);  %# Create a 4-by-5 matrix
>> B = mat(2:5,:);  %# Create another 4-by-5 matrix

>> C = zeros(5);  %# Initialize C to be 5-by-5
>> for i = 1:4, C = C + A(i,:).'*B(i,:); end;  %'# Calculate C as you are now

>> isequal(C, A.'*B)  %'# Test for equality with the shorter solution

ans =

     1  %# Equal!
2 голосов
/ 12 января 2012

Возможно, я неправильно понимаю, но я верю, что вы ищете

C = A*B';
2 голосов
/ 10 января 2012

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

Ваш цикл for не особенно плох, потому что вы делаете цикл только n раз, но выполняете O(n*m) каждый цикл.Поскольку вы выполняете много работы на каждой итерации, штраф за цикл не так уж и велик.Действительно плохие ситуации - это вложенные циклы, например, если вы вычислили внешние продукты с помощью вложенных циклов for.

...