将 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]);
我有 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]);