我已经有一个N_1 x N_2
矩阵A
和一个N_2 x N_3
矩阵B
。
我想创建一个N_1 x N_2 x N_3
矩阵C
,以便C(i,j,k) = A(i,j)*B(j,k)
。
我想知道是否可以使用一些Matlab操作创建C
,而不是逐个元素地创建它?
答案 0 :(得分:4)
你可以使用bsxfun
(实际上使用类似的方法在内部工作,但有点清洁)做OP的回答:
C = bsxfun(@times, A, permute(B, [3 1 2]));
这也快得多(bsxfun
必须在内部做一些魔法 - 可能利用MATLAB的内部能力来使用多个线程进行某些操作,或者可能只是更小的矩阵的置换很多更快,或类似因素的某种组合):
>> N1 = 100; N2 = 20; N3 = 4; A = rand(N1, N2); B = rand(N2, N3);
>> tic; for n = 1:10000; C = repmat(A, [1, 1, size(B, 2)]) .* permute(repmat(B, [1, 1, size(A, 1)]), [3, 1, 2]); end; toc
Elapsed time is 2.827492 seconds.
>> tic; for n = 1:10000; C2 = bsxfun(@times, A, permute(B, [3 1 2])); end; toc
Elapsed time is 0.287665 seconds.
修改:将permute
内部的repmat
移动一段时间,但它仍然远不及bsxfun
:
>> tic; for n = 1:10000; C = (repmat(A, [1 1 size(B, 2)]) .* repmat(permute(B, [3 1 2]), [size(A, 1) 1 1])); end; toc
Elapsed time is 2.563069 seconds.
答案 1 :(得分:2)
相当笨拙,但似乎有效:
C = repmat(A, [1, 1, size(B, 2)]) .* permute(repmat(B, [1, 1, size(A, 1)]), [3, 1, 2]);