有人知道MATLAB用于矩阵乘法的算法及其时间复杂度吗?
有人知道MATLAB用于矩阵乘法的算法及其时间复杂度吗?
为了完整起见--如此线程所提到的,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
DGEMM
相比,速度提高了约10%-尽管我不知道它是否过时)。另一方面,Coppersmith-Winograd算法“仅在矩阵非常大以至于现代硬件无法处理时才提供优势”。我通过创建一些视频来更新这个答案,演示了块矩阵乘法算法相对于朴素算法的局部性。
在以下每个视频中,我们将可视化两个8x8矩阵A和B的乘法,以创建乘积C = A x B。黄色高亮显示了算法每一步中正在处理的每个矩阵A、B和C中的元素。您可以看到块矩阵乘法仅逐个处理矩阵的小块,并多次重复使用每个块,以使数据在本地内存中移入和移出的次数最小化。