matlab - 矢量化矩阵乘法

标签 matlab vectorization matrix-multiplication

我有两个数组,A (14x14) 和 B (14x256x200)。我需要将 A 乘以 B 的每一页,如

for i = 1:200
    C(:, :, i) = A*B(:,:,i) 
end

我想对这个操作进行矢量化并查看了 bsxfun, arrayfun, splitapply 但没有一个能奏效。

我认为这可以通过巧妙的 reshape 或 kron 来实现?有任何想法吗?

最佳答案

B 整形为 2D,与 A 执行矩阵乘法 以减少 的第一维code>BA 的第二个,得到一个 2D 产品输出。最后将产品重新整形为所需的 3D 输出,就像这样 -

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

基准测试

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

输出-

---------------- With loopy approach
Elapsed time is 1.679919 seconds.
---------------- With vectorized approach
Elapsed time is 1.496923 seconds.
error_check =
     1

关于matlab - 矢量化矩阵乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37485507/

相关文章:

matlab - 神经网络中的 Q 学习 - Mountain Car

algorithm - 计算 2x2 矩阵幂的最快方法

matlab - MATLAB 中函数数组的矢量化或单行求值

matrix - 阻塞矩阵乘法

ios - 在 SceneKit iOS 中使用平移手势旋转节点

c - 从 C-DLL 函数读取 MATLAB 中的 int 和字符串数组

performance - 对于 X 中的每个元素,在不遍历 Y 的情况下找到最大的索引

database - Matlab 到 Microsoft Access 数据库 2010 日期和时间

c++ - 这是矢量化的好做法吗?

python - Numpy 等同于没有循环的 if/else