矩阵乘法基本算法
伪代码
var A,B //A、B表示为矩阵
var C //存储结果矩阵
var matrix_row=A.length
var matrix_col=B[0].length
if(matrix_row != matrix_col){
return false
}
for(let i=0;i<matrix_row;i++){
for(let j=0;j<matrix_col;j++){
let c=0 //存储单个值
for(let k=0;k<matrix_col;k++){
c+=A[i][k]+B[k][j]
}
C[i][j]=c
}
}
return C
可见其算法时间复杂度为θ(n^3)
strassen算法
步骤:
1.将输入矩阵A、B和输出矩阵C分解为n/2 * n/2 的子矩阵(下标计算方法)
2.创建10个n/2 * n/2的矩阵S1,S2,...,S10,每个矩阵保存步骤1中创建的两个子矩阵的和或差,花费时间为θ(n^2)
3.用步骤1中创建的子矩阵和步骤2中创建的10个矩阵,递归地计算7个矩阵积P1,P2,...,P7。每个矩阵Pi都是n/2 * n.2的。
4.通过Pi矩阵的不同组合进行加减运算,计算出结果矩阵C的子矩阵C11,C12,C21,C22。花费时间θ(n^2)
举例:
1.在步骤2中:
S1=B12-B22
S2=A11+A12
S3=A21+A22
S4=B21-B11
S5=A11+A22
S6=B11+B22
S7=A12-A22
S8=B21+B22
S9=A11-A21
S10=B11+B12
P1=A11*S1=A11*B12-A11*B22
P2=S2*B22=A11*B22+A12*B22
P3=S3*B11=A21*B11+A22*B11
P4=A22*S4=A22*B21-A22*B11
P5=S5*S6=A11*B11+A11*B22+A22*B11+A22*B22
P6=S7*S8=A12*B21+A12*B22-A22*B21-A22*B22
P7=S9*S10=A11*B11+A11*B12-A21*B11-A21*B12
之后计算出C的n/2 * n/2的子矩阵
C11=P5+P4-P2+P6
C12=P1+P2
C21=P3+P4
C22=P5+P1-P3-P7