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

How to do a fast matrix multiplication for each column of two matrices without for loops?

我有两个矩阵 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的列相乘得到的矩阵,先建好吗C 然后在每个循环中使用它的第 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,[])

您可以避免进入接下来列出的第 4 维,但它仍然比早期的 4D 方法慢一些 -

C = reshape(bsxfun(@times,permute(A,[1 3 2]),B(:).'),N1,N2,[])

作为 , you can generate all 4-fold combinations of row and column indices of the two matrices (with 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);