选中一个结果,看一行与一列,如何相遇。
一行遇见一列。将 A 的第 1 行,与 B 的第 1 列逐项相乘,再求和。
三种算法采用不同的计算顺序,复杂度均为 O(mkn)。分块的优势在于数据访问;小矩阵的动画速度不代表算法性能。显示最多 4 位小数,计算保留原始精度。
选取 A 的一行和 B 的一列,对应元素相乘后相加,就得到结果矩阵中的一个数。重复这个过程,填满整个结果矩阵。
for i in rows(A) for j in columns(B) for r in columns(A) C[i,j] += A[i,r] * B[r,j]
m、k、n 分别对应 A 的行数、公共维度和 B 的列数。完整计算需要 mkn 次乘法;改变循环顺序不会改变渐近复杂度。
Strassen 把两个 2×2 块矩阵相乘所需的 8 次块乘法减少为 7 次。递归应用后,方阵时间复杂度为 O(n^log₂7),约 O(n²·⁸⁰⁷)。它引入更多加减法与中间数据,小矩阵并不一定更快。本实验演示的三种算法均为经典乘法,没有运行 Strassen。