我有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
有人建议我可以使用张量函数有效地实现此目的,但我无法弄清楚这一点。
答案 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())