如何在没有 for 循环的情况下对两个矩阵的每一列进行快速矩阵乘法?
How to do a fast matrix multiplication for each column of two matrices without for loops?
我有两个矩阵 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
的列相乘得到的矩阵,先建好吗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);
我有两个矩阵 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
的列相乘得到的矩阵,先建好吗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,[])
作为 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);