有谁知道MATLAB用于矩阵乘法的算法及其时间复杂度是多少?
2009年在Matlab Central上回答了这个问题(具体请参见Tim Davis的第二个答复)。 不知道从那以后有什么变化...
为了完整性-如该线程中所述,Matlab使用BLAS(基本线性代数子程序)中的DGEMM(双通用矩阵乘法)例程。
请注意,没有BLAS的单一实现-针对特定的处理器体系结构进行了调整。因此,如果不找出正在使用哪个版本的BLAS,就不能完全确定计算机上正在使用哪种算法。
BLAS规范指定了每个子例程的输入和输出,并为每个子例程的输出提供了可接受的误差范围。只要遵循规范,实现即可自由使用其喜欢的任何算法。
BLAS的参考实现在DGEMM中使用块矩阵乘法算法,该算法具有时间复杂度O(n ^ 3)来将两个n x n矩阵相乘。我认为可以合理地假设,大多数BLAS实现将或多或少地遵循参考实现。
请注意,它不使用朴素矩阵乘法算法
for i = 1:N
for j = 1:N
for k = 1:N
c(i,j) = c(i,j) + a(i,k) * b(k,j);
end
end
end
这是因为通常,整个矩阵都无法放入本地内存。如果不断将数据移入和移出本地内存,该算法将变慢。块矩阵算法将操作分为几个小块,这样每个块都足够小以适合本地内存,从而减少了移入和移出内存的次数。
存在渐近更快的矩阵乘法算法,例如Strassen算法或Coppersmith-Winograd算法,其速率比O(n ^ 3)稍快。但是,它们通常不了解缓存,而忽略局部性-意味着数据需要不断在内存