Uri*_*hen 3 performance matlab matrix matrix-multiplication
在matlab中,我想使用L矩阵乘以M个向量,得到M×L个新向量.具体来说,假设我有一个大小为N x M的矩阵A和一个大小为N x N x L矩阵的矩阵B,我想计算一个大小为N x M x L的矩阵C,其中结果与下面的结果完全相同码:
for m=1:M
for l=1:L
C(:,m,l)=B(:,:,l)*A(:,m)
end
end
Run Code Online (Sandbox Code Playgroud)
但要有效地实现这一点(使用本机代码而不是matlab循环).
我们可以在这里使用 快速矩阵乘法,只需要重新排列尺寸.因此,将第二个维度推回到B
最后并重新整形,以便2D
合并前两个dims.执行矩阵乘法A
以给我们一个2D数组.我们称之为C
.现在,C's
第一个昏暗的是合并的dims B
.因此,将其拆分为原始的两个暗淡长度,并重新整形,从而产生3D阵列.最后再将第二个暗点向后推回到后面permute
.这是所需的3D
输出.
因此,实施将是 -
permute(reshape(reshape(permute(B,[1,3,2]),[],N)*A,N,L,[]),[1,3,2])
Run Code Online (Sandbox Code Playgroud)
基准代码:
% Setup inputs
M = 150;
L = 150;
N = 150;
A = randn(N,M);
B = randn(N,N,L);
disp('----------------------- ORIGINAL LOOPY -------------------')
tic
C_loop = NaN(N,M,L);
for m=1:M
for l=1:L
C_loop(:,m,l)=B(:,:,l)*A(:,m);
end
end
toc
disp('----------------------- BSXFUN + PERMUTE -----------------')
% @Luis's soln
tic
C = permute(sum(bsxfun(@times, permute(B, [1 2 4 3]), ...
permute(A, [3 1 2])), 2), [1 3 4 2]);
toc
disp('----------------------- BSXFUN + MATRIX-MULT -------------')
% Propose in this post
tic
out = permute(reshape(reshape(permute(B,[1,3,2]),[],N)*A,N,L,[]),[1,3,2]);
toc
Run Code Online (Sandbox Code Playgroud)
时间:
----------------------- ORIGINAL LOOPY -------------------
Elapsed time is 0.905811 seconds.
----------------------- BSXFUN + PERMUTE -----------------
Elapsed time is 0.883616 seconds.
----------------------- BSXFUN + MATRIX-MULT -------------
Elapsed time is 0.045331 seconds.
Run Code Online (Sandbox Code Playgroud)