将 n 个长度为 p 的向量乘以 n 个大小为 pxp 的矩阵

Multiply n vectors of length p by n matrices of size pxp

我有 n 个长度为 p 的复向量,我想将其乘以 n 个大小为 p×p 的复矩阵。我正在寻找在 MATLAB 中执行此操作的最有效方法。如果重要的话,我想象 n 很大而 p 很小。

下面显示了一个使用循环(我想避免)的示例。

N = 1e4;
p = 5;
A = randn(p, N); % N vectors of length p
B = randn(p, p, N); % N matrices of size pxp

C = zeros(p, N); 
for k = 1:N
    C(:, k) = B(:, :, k) * A(:, k);
end

有人建议我可以使用张量函数有效地实现这一点,但我一直无法弄清楚。

您可以通过多种方式实现:

A = rand(3, 3, 1e6);
B = rand(3, 1);
tic, C = zeros(3, size(A, 3));
for i = 1:size(A, 3)
  C(:,i) = A(:,:,i)*B ;
end, toc
tic; C = reshape(reshape(permute(A,[2,1,3]),3,[]).'*B,3,[]); toc
tic; C = squeeze(sum(bsxfun(@times, A, reshape(B, 1, 3)), 2)); toc

在我的系统中:

Elapsed time is 2.067629 seconds.  % Loop
Elapsed time is 0.064164 seconds.  % permute
Elapsed time is 0.145738 seconds   % sum(times())

这是使用 implicit expansion 的方法:

C = permute(sum(B.*permute(A, [3 1 2]), 2), [1 3 2]);

对于旧的 Matlab 版本(R2016b 之前),您需要用 bsxfun:

重写它
C = permute(sum(bsxfun(@times, B, permute(A, [3 1 2])), 2), [1 3 2]);