matlab - 多个矩阵乘以多个向量的快速乘法

标签 matlab performance matrix matrix-multiplication

在 matlab 中,我想用 L 个矩阵乘以 M 个向量,得到 M x 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

但要有效地实现这一点(使用 native 代码而不是 matlab 循环)。

最佳答案

我们可以滥用 fast matrix-multiplication在这里,只需要重新排列尺寸。因此,将 B 的第二个维度推回末尾并 reshape 为 2D,以便合并前两个维度。对 A 执行矩阵乘法,得到一个二维数组。我们称它为 C。现在,C 的 第一个 dim 是来自 B 的合并的 dim。因此,通过 reshape 生成 3D 阵列,将其拆分回原来的两个暗淡长度。最后用一个 permute 将第二个 dim 推回到后面。这是所需的 3D 输出。

因此,实现将是 -

permute(reshape(reshape(permute(B,[1,3,2]),[],N)*A,N,L,[]),[1,3,2])

基准测试

基准代码:

% 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

时间:

----------------------- 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.

关于matlab - 多个矩阵乘以多个向量的快速乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46247252/

相关文章:

Python 正则表达式 : re. search() 在大型文本文件上速度极慢

python - 如何在 Python 3 中使用 "melt" `pandas.DataFrame` 对象?

r - 选择由 R 中的随机向量指定的列

matlab - 在 Matlab 或 matplotlib 中根据法向量和点绘制平面

matlab - 对 3D 矩阵中的 block 求和 - MATLAB

python - 为什么Matlab和scikit-learn使用PLS回归时结果不同?

c# - 批量插入最好的办法是什么? + 帮助我完全理解我目前的发现

c - 为性能预先计算掩码

python - 获取索引映射的数组的子数组的有效方法

matlab - MATLAB inputParser 中的异常行为