给定一个矩阵 A
,我需要与其他 n
向量相乘 Bi
(即 i=1...n
)。 A
的大小可以是 5000x5000
,因此 Bi
可以是 5000x1
。
如果我按以下方式评价产品:
for i=1:n
product=A*Bi;
% do something with product
end
结果比计算以下产品慢(数量级):
%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
问题是向量Bi
的数量n
可能太大而无法存储在内存中,例如n=300000
,所以我需要使用循环方法,每次评估产品时,使用它然后丢弃向量 Bi
。
为什么这种方法与直接乘法相比这么慢,有没有办法克服这个问题?
最佳答案
例如,您可以尝试循环处理批处理
for i = 0:(n/k)-1
product = A*S(:,(i*k+1):(i+1)*k)
end
并调整 k
为您找到速度和内存的最佳权衡。
MATLAB 的循环很慢,因为它是一种解释型语言。所以它必须即时处理很多事情。如今,由于 JIT 编译器,循环得到了很大改进,但与用 C 编写和编译的内置函数相比,它们仍然很慢。此外,它们使用真正尖端的超快速矩阵乘法算法,与使用通过循环实现的相当幼稚的算法,这也有助于您正在体验的加速。
关于performance - Matlab 重复矩阵乘法 - 循环与内置性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34675870/