从两个2-dim矩阵创建一个3-dim矩阵

时间:2013-05-03 07:09:39

标签: matlab

我已经有一个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,而不是逐个元素地创建它?

2 个答案:

答案 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]);