如何将矩阵A的每一列乘以矩阵B的每一行,并在Matlab中求和矩阵?

时间:2014-02-06 10:04:36

标签: performance matlab matrix matrix-multiplication

我有一个问题,希望可以轻松解决。 A是N G矩阵,B是N G矩阵。目标是获得矩阵C

enter image description here

等于将每列转置的A乘以B的每一行并求和得到的矩阵;求和之前这种矩阵的总数是N N,它们的大小是G G. 这可以在MatLab中使用两个 for -loops轻松完成:

N=5;
G=10;
A=rand(N,G);
B=rand(N,G);
C=zeros(G);
for n=1:1:N
    for m=1:1:N
        C=C+A(m,:)'*B(n,:);
    end
end

然而,对于大型矩阵来说,它很慢。

所以,我的问题是: 在Matlab中有更有效的计算C矩阵的方法吗?

谢谢

3 个答案:

答案 0 :(得分:7)

如果你为两个3×3矩阵写出全部内容,你会发现操作基本上等于:

C = bsxfun(@times, sum(B), sum(A).');

在此处针对N=50G=100运行每个答案并重复每种方法100次:

Elapsed time is 13.839893 seconds. %// OP's original method
Elapsed time is 19.773445 seconds. %// Luis' method
Elapsed time is 0.306447 seconds.  %// Robert's method
Elapsed time is 0.005036 seconds.  %// Rody's method

(最快和最慢的方法之间≈4000的因子......)

答案 1 :(得分:3)

我认为这应该会显着提高性能

C = zeros(G);
for n = 1:N
   C = C + sum(A,1)'*B(n,:);
end

您可以避免一个循环,并且还应该避免内存不足的问题。根据我的基准测试,它比使用两个循环的方法快20倍。 (注意,我必须在Octace中进行基准测试,因为我在这台PC上没有MATLAB)。

答案 2 :(得分:2)

使用bsxfun代替循环,然后sum两次:

C = sum(sum(bsxfun(@times, permute(A, [2 3 1]), permute(B,[3 2 4 1])), 3), 4);