Matlab重复矩阵乘法 - 循环与内置性能

xan*_*anz 5 performance matlab matrix matrix-multiplication memory-efficient

给定矩阵A,我需要与其他n向量相乘Bi(即i=1...n).大小A可以像5000x5000,因此Bi喜欢5000x1.

如果我按以下方式评估产品:

for i=1:n
    product=A*Bi;
    % do something with product
end
Run Code Online (Sandbox Code Playgroud)

结果是比计算产品的方式(数量级)慢:

%assume that S is a matrix that contains the vectors Bi as columns, i.e. S(:,i)=Bi, then:
results=A*S;   %stores all the products in matrix form
% do something with results
Run Code Online (Sandbox Code Playgroud)

的问题是,数n矢量的Bi 可能太大而被存储在存储器中,例如n=300000,所以需要使用一个环方法,其中每个时间予评估该产品,用它,然后丢弃该载体Bi.

与直接乘法相比,为什么这种方法如此缓慢,有没有办法克服这个问题?

Dan*_*Dan 4

您可以尝试循环批次,例如

for i = 0:(n/k)-1
    product = A*S(:,(i*k+1):(i+1)*k)
end
Run Code Online (Sandbox Code Playgroud)

并进行调整k以找到最适合您的速度和内存的权衡。

MATLAB 的循环速度很慢,因为它是一种解释性语言。所以它必须即时解决很多问题。由于 JIT 编译器的存在,如今的循环得到了极大的改进,但与用 C 编写和编译的内置函数相比,它们仍然很慢。除此之外,它们使用了真正前沿的超快速矩阵乘法算法,相比之下通过循环实现相当简单的算法,这也有助于您体验到的加速。