2015-11-22 4 views
2

Теперь у меня есть матрица A размерности N на p, а другая матрица B размерности N на q. То, что я хочу, чтобы это матрица, скажем, C, размерности N на PQ таким образом, чтоМногомерный вариант продукта «kron»?

C(i,:) = kron(A(i,:), B(i,:)); 

Если N велико, цикл по N строк может занять довольно много времени. Таким образом, в настоящее время я увеличения А и В соответственно (комбинируя использование repmat, переставлять и Reshape), чтобы превратить каждую матрицу размерности N на рд, а затем сформулировать C чем-то вроде

C = A_aug .* B_aug; 

Любые лучшая идея?

+1

Заканчивать 'superkron' на FileExchange от Matlab - http://www.mathworks.com/matlabcentral/fileexchange/32578-superkron – rayryeng

ответ

2

Checkout некоторые bsxfun + permute + reshape магия -

out = reshape(bsxfun(@times,permute(A,[1 3 2]),B),size(A,1),[]) 

Бенчмаркинг & Проверка

Бенчмаркинг код -

%// Setup inputs 
N = 200; 
p = 190; 
q = 180; 
A = rand(N,p); 
B = rand(N,q); 

disp('--------------------------------------- Without magic') 
tic 
C = zeros(size(A,1),size(A,2)*size(B,2)); 
for i = 1:size(A,1) 
    C(i,:) = kron(A(i,:), B(i,:)); 
end 
toc 

disp('--------------------------------------- With some magic') 
tic 
out = reshape(bsxfun(@times,permute(A,[1 3 2]),B),size(A,1),[]); 
toc 

error_val = max(abs(C(:)-out(:))) 

Выход -

--------------------------------------- Without magic 
Elapsed time is 0.524396 seconds. 
--------------------------------------- With some magic 
Elapsed time is 0.055082 seconds. 
error_val = 
    0 
+2

Спасибо, Divakar. Это умная магия. –

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