我有两个数组,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>B
和 A
的第二个,得到一个 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/