2013-08-26 5 views
-1

Я хочу сделать это без петель:Умножение матрицы послойно

% A ~ 4x2x3; B ~ 4x3x2; C ~ 4x2x2; 
for i=1:4 
    C(i,:,:) = squeeze(A(i,:,:))*squeeze(B(i,:,:)); 
end 

Спасибо!

+3

http://www.mathworks.com/matlabcentral/fileexchange/25977-mtimesx-fast-matrix-multiply-with-multi-dimensional-support – Dan

+0

@ Благодарим! Но мне нужен простой код ... – Kuraga

+2

Не должно быть 'C (i,:, :) = сжать (A (i,:, :)) * сжать (B (i,:, :))' или что нибудь? –

ответ

1

Не протестированные это (так что это не гарантированно быстрее), но здесь идет:

[L, ma, na] = size(A); 
[L, mb, nb] = size(B); 
AX = reshape(permute(A, [2 1 3]), [], na); 
BX = reshape(permute(B, [2 3 1]), mb, []); 
CX = reshape(permute(reshape(AX * BX, ma, L, nb, L), [1 3 2 4]), ma, nb, []); 
C = permute(CX(:, :, 1:L + 1:end), [3 1 2]); 

Обратите внимание, что вы можете также столкнуться с проблемами памяти, если A и B велики (в этом случае вам придется прибегать к петлям).

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