如何在没有for循环的情况下对两个矩阵的每列进行快速矩阵乘法?

时间:2015-04-16 17:27:15

标签: matlab for-loop matrix vectorization multiplication

我有两个矩阵AB,我想为它们的每个列进行乘法以生成一个新矩阵。我想到的第一件事是

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的第三维矩阵,这些矩阵是通过AB的列的乘法构建的,是否最好先构建{ {1}}然后在每个循环中使用它的第三维矩阵或者只是在每个循环中进行乘法运算?

2 个答案:

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