我已经有一个 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
,而不是逐个元素地创建?
最佳答案
您可以使用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.
关于matlab - 从两个 2 维矩阵创建一个 3 维矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16353522/