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

Performance 如何将矩阵A的每一列乘以矩阵B的每一行,并在Matlab中对得到的矩阵求和?,performance,matlab,matrix,matrix-multiplication,Performance,Matlab,Matrix,Matrix Multiplication,我有一个问题,我希望可以很容易地解决。 A是NG矩阵,B是NG矩阵。目标是得到矩阵C 等于转置A的每一列乘以B的每一行,并对所得矩阵求和;求和前此类矩阵的总数为NN,其大小为GG 这可以在MatLab中通过两个for循环轻松完成: 然而,对于大型矩阵,它是相当缓慢的 所以,我的问题是: 在Matlab中计算C矩阵有没有更有效的方法 谢谢您使用代替循环,然后两次: 我认为这将显著提高性能 C = zeros(G); for n = 1:N C = C + sum(A,1)'*B(n,:);

我有一个问题,我希望可以很容易地解决。 A是NG矩阵,B是NG矩阵。目标是得到矩阵C

等于转置A的每一列乘以B的每一行,并对所得矩阵求和;求和前此类矩阵的总数为NN,其大小为GG 这可以在MatLab中通过两个for循环轻松完成:

然而,对于大型矩阵,它是相当缓慢的

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

谢谢您

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


我认为这将显著提高性能

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

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

如果你写出两个3×3矩阵,你会发现运算基本上等于:

C = bsxfun(@times, sum(B), sum(A).');
在此处运行
N=50
G=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

(a)系数≈ 4000,介于最快和最慢的方法之间……

+1,用于表达良好、有效的问题和自足的问题code@BibekN=2的子EDI;G=2;A=[12;34];B=[56;78];我的代码返回C=[48 56;72 84]和A'*B=[26 30;38 44]A'*B等于单和{n}A{ni}B{nk},而不是双和{m,n}A{mi}B{nk}need@Adiel至于
arrayfun
我同意。至于
bsxfun
,我不太想回答,我已经检查了它,它对小N和G的效果很好。但是对于G=1000和N=100(比我的实矩阵还小),我的系统内存不足。@Rodyoldenhui是的,我按字面意思应用了OP的描述(乘法然后相加)。我没有意识到,正如你在回答中所说,先添加可以节省大量内存和操作。非常感谢你,这让我感到羞愧,因为我自己没有看到它)+1想得好!在这种情况下,可以大大减少操作的数量
C = bsxfun(@times, sum(B), sum(A).');
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