2015-09-20 3 views
2

Предположим, у меня есть 2 вектора, и я хочу сделать внешний продукт. Я мог бы использовать:Дозирующие наружные изделия с bsxfun

A=x*y'; 

Или я мог бы использовать bsxfun вроде:

bsxfun(@times,x,y') 

Но я хочу пакетные внешние продукты. У меня есть 2 матрицы, каждый имеет p векторов:

n=1000; p=6; 
A=rand(n,p); 
D=rand(n,p); 

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

AA=zeros(n,n); 

for j=1:p 
    AA = AA + A(:,j) * D(:,j).'; 
end 

я хочу более эффективно делать это, но я могу Нет.

+0

Вы ищете решение, в котором вы комбинируете 'bsxfun' с' permute'. – Adriaan

+0

'C = bsxfun (@ times, A, permute (D. ', [3 1 2]));' дает мне «1000x6x1000» за очень короткое время, хотя я не уверен, что это правильный результат. – Adriaan

+0

результат должен быть 1000x1000 – alonhzn

ответ

4

Просто умножить две матрицы вместе:

n=1000; p=6; 
A=rand(n,p); 
D=rand(n,p); 

way1=zeros(n,n); 

for j=1:p 
    way1 = way1 + A(:,j) * D(:,j).'; 
end 

way2 = A * D.'; 

any(way1(:) ~= way2(:)) 
+0

omg, вы правы! – alonhzn

+0

Хорошее решение, хотя я бы не использовал 'j' как [переменную] (http://stackoverflow.com/questions/14790740/using-i-and-j-as-variables-in-matlab). Сегодня вечером я сделаю «время», чтобы узнать, что быстрее. – Adriaan

3

Вы можете использовать bsxfun после всего:

C = bsxfun(@times,A,permute(D,[3 2 1])); 
result = sum(C,2); 

Первая строка вычисляет все внешние продукты между A и D, вторые СУММ ваши результаты вместе, в соответствии с просьбой.

Испытано следующим образом:

kk = 1e3; 
times1 = zeros(kk,1); 
n=1000; p=6; 
A=rand(n,p); 
D=rand(n,p); 
for ii = 1:kk 
    tic 
    C = bsxfun(@times,A,permute(D.',[3 1 2])); 
    result = sum(C,2); 
    times1(ii) = toc; 
end 
mean(times1) 

bsxfun принимает 0.0456s и прямое умножение имеет 0.0075s, хотя я подозреваю, что мое решение на самом деле делает все 6 раз, из-за перестановочны, который не находится в прямом умножении. Таким образом, для внешнего продукта bsxfun занимает 0,0076 с, что почти равно.

+0

Это решение, которое я бы принял. +1. – rayryeng

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