【问题标题】:How to do a fast matrix multiplication for each column of two matrices without for loops?如何在没有 for 循环的情况下对两个矩阵的每一列进行快速矩阵乘法?
【发布时间】:2015-06-23 06:49:55
【问题描述】:

我有两个矩阵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 然后使用它的每个循环中的第三维矩阵还是只在每个循环中进行乘法运算?

【问题讨论】:

    标签: matlab for-loop matrix vectorization multiplication


    【解决方案1】:

    作为Divakar's answer 的替代方案,您可以生成两个矩阵(使用ndgrid)的行和列索引的所有4 折组合,然后计算乘积:

    [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=rand(50)B=rand(50) 并且以前的解决方案更快
    • @shalooshaloo 是的,bsxfun 通常比其他任何东西都快。这本来是我的第一个建议,但 Divakar 先到了 :-)
    【解决方案2】:

    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,[])
    

    【讨论】:

    • @shalooshaloo 作为对编辑的回应,您可以使用此答案中的矢量化方法,然后直接使用 C 的第三维矩阵和C(:,:,iter),其中iter 将是您的循环迭代器。因此,使用这种矢量化方法,您将预先计算 C。我假设您将在某个循环中使用这些 C 值。这有意义吗?
    • 是的,这是有道理的,您认为当您首先构建 C 然后在迭代中使用它时有什么不同,C( : , : , iter) 或者只是在 for 循环中乘以列?
    • @shalooshaloo 我认为很大程度上取决于您如何实际使用这些 C(:,:,iter) 值。如今,JIT 相当强大,但对它如何优化 for 循环却知之甚少。
    • 您的解决方案是在第一个 for 用于 A 时编写的,如果第一个 for 在 B 的列上,我该如何更改它?
    • @shalooshaloo reshape(bsxfun(@times,permute(A,[1 4 2 3]),permute(B,[4 1 3 2])),N1,N2,[]).
    猜你喜欢
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多