文章目录
矩阵乘法的定义:
若 A = ( a i j ) A=(a_{ij}) A=(aij) 和 B = ( b i j ) B=(b_{ij}) B=(bij) 是 n × n n \times n n×n 的方阵, 则对 i , j = 1 , 2 , . . . , n i, j = 1, 2, ..., n i,j=1,2,...,n,定义乘积 C = A ⋅ B C=A\cdot B C=A⋅B 中的元素 c i j c_{ij} cij 为:
c i j = ∑ k = 1 n a i k ⋅ b k j c_{ij} = \sum_{k=1}^{n} a_{ik} \cdot b_{kj} cij=k=1∑naik⋅bkj
按照矩阵乘法的定义不难写出算法1
// 算法1:定义法
pub fn square_matrix_multiply<T: Default + Clone + AddAssign + Mul<Output = T>>(
a: &Vec<Vec<T>>,
b: &Vec<Vec<T>>,
) -> Vec<Vec<T>>
where
T: Mul<T>,
{
let mut c = vec![vec![T::default(); a.len()]; a.len()];
if a.len() == a[0].len() && b.len() == a[0].len() && a.len() == b.len() {
let n = a.len();
for i in 0..n {
for j in 0..n {
c[i][j] = T::default();
for k in 0..a.len() {
c[i][j] += a[i][k].clone() * b[k][j].clone();
}
}
}
}
return c;
}
由于三重 for
循环的每一重都恰好执行 n
步,因此该算法的时间复杂度为 O ( n 3 ) O(n^3) O(n3)
为此我们尝试改进
一个简单的分治算法
为简单起见,假定三个矩阵均为 n × n n \times n n×n 矩阵, n n n 是 2 2 2 的幂,矩阵 A , B , C A, B, C A,B,C 均分解为 4 4 4 个 n / 2 × n / 2 n / 2 \times n / 2 n/2×n/2 的子矩阵,则计算公式等价于
C 11 = A 11 ⋅ B 11 + A 12 ⋅ B 21 C_{11} = A_{11} \cdot B_{11} + A_{12} \cdot B_{21} C11=A11⋅B11+A12⋅B21
C 12 = A 11 ⋅ B 12 + A 12 ⋅ B 22 C_{12} = A_{11} \cdot B_{12} + A_{12} \cdot B_{22} C12=A11⋅B12+A12⋅B22
C 21 = A 21 ⋅ B 11 + A 22 ⋅ B 21 C_{21} = A_{21} \cdot B_{11} + A_{22} \cdot B_{21} C21=A21⋅B11+A22⋅B