我有一个问题,希望可以轻松解决。 A是N G矩阵,B是N G矩阵。目标是获得矩阵C
等于将每列转置的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矩阵的方法吗?
谢谢
答案 0 :(得分:7)
如果你为两个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
(最快和最慢的方法之间≈4000的因子......)
答案 1 :(得分:3)
我认为这应该会显着提高性能
C = zeros(G);
for n = 1:N
C = C + sum(A,1)'*B(n,:);
end
您可以避免一个循环,并且还应该避免内存不足的问题。根据我的基准测试,它比使用两个循环的方法快20倍。 (注意,我必须在Octace中进行基准测试,因为我在这台PC上没有MATLAB)。
答案 2 :(得分:2)