矢量化矩阵乘法

cro*_*eer 4 matlab vectorization matrix-multiplication

我有两个阵列,A(14x14)和B(14x256x200).我需要将B的每一页矩阵乘以A,如下所示

for i = 1:200
    C(:, :, i) = A*B(:,:,i) 
end
Run Code Online (Sandbox Code Playgroud)

我想对这个操作进行矢量化,并查看了bsxfun,arrayfun,splitapply,但没有一个可以解决问题.

我认为这可以通过聪明的重塑或克朗来实现吗?有任何想法吗?

Div*_*kar 8

重塑B2D,则执行matrix-multiplicationA降低的第一维B和第二的A,并得到一个2D产品输出.最后将产品重新塑造成所需的3D输出,如下所示 -

[m,n,p] = size(B); %// Store size parameters
C = reshape(A*reshape(B,m,[]),m,n,p)
Run Code Online (Sandbox Code Playgroud)

标杆

num_iter = 100; %// Number of iterations to run benchmarks

for k = 1:50000
    tic(); elapsed = toc(); %// Warm up tic/toc.

end

%// Size parameters and setup input arrays
m = 14;
n = 256;
p = 200;
A = rand(m,m);
B = rand(m,n,p);

disp('---------------- With loopy approach')
tic
for ii = 1:num_iter
    C = zeros(m,n,p);
    for i = 1:p
        C(:, :, i) = A*B(:,:,i);
    end
end
toc

disp('---------------- With vectorized approach')
tic
for ii = 1:num_iter
    [m,n,p] = size(B);
    Cout = reshape(A*reshape(B,m,[]),m,n,p);
end
toc

error_check = isequal(C,Cout) %// 1 means good
Run Code Online (Sandbox Code Playgroud)

输出 -

---------------- With loopy approach
Elapsed time is 1.679919 seconds.
---------------- With vectorized approach
Elapsed time is 1.496923 seconds.
error_check =
     1
Run Code Online (Sandbox Code Playgroud)

  • @DavidKelley好的tic/tocs是funcs有他们自己的运行时被无意中听到.这不能消除,也许可以忽略不计,但为了最大限度地减少开销,可以在实际使用它们进行计时之前运行它们相当长的时间.我想它会以某种方式进行缓存.我采用这个作为最佳实践,我真的不记得我何时/何地从中挑选,但我想我记得它背后的基本思想.希望有所了解!:) (2认同)