我有两个矩阵A
和B
,我想为它们的每个列进行乘法以生成一个新矩阵。我想到的第一件事是
A = rand(4,3);
B = rand(4,3);
for J=1:SIZE(A,2)
for jj=1:size(B,2)
C(:,:,m) = A(:,j)*B(:,jj)' ;
m = m+1 ;
end
end
但我不想使用for
循环使其变慢。有什么办法吗?
我将使用C
的第三维矩阵,这些矩阵是通过A
和B
的列的乘法构建的,是否最好先构建{ {1}}然后在每个循环中使用它的第三维矩阵或者只是在每个循环中进行乘法运算?
答案 0 :(得分:3)
使用bsxfun
-
N1 = size(A,1);
N2 = size(B,1);
C = reshape(bsxfun(@times,permute(A,[1 4 3 2]),permute(B,[4 1 2 3])),N1,N2,[])
你可以避免进入下一个列出的第四维度,但它仍然比早期的4D方法慢一点 -
C = reshape(bsxfun(@times,permute(A,[1 3 2]),B(:).'),N1,N2,[])
答案 1 :(得分:1)
作为Divakar's answer的替代方法,您可以生成两个矩阵的行和列索引的所有4倍组合(使用ndgrid
),然后计算产品:
[m, p] = size(A);
[n, q] = size(B);
[mm, nn, qq, pp] = ndgrid(1:m, 1:n, 1:q, 1:p);
C = reshape(A(mm+(pp-1)*m).*B(nn+(qq-1)*n), m, n, p*q);