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

时间:2018-09-24 18:56:34

标签: matlab matrix matrix-multiplication complex-numbers tensor

我有n个长度为p的复数向量,我想乘以np乘以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

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

2 个答案:

答案 0 :(得分:2)

这是使用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]);

答案 1 :(得分:0)

您可以通过多种方式完成该任务:

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())