strassen算法

矩阵乘法基本算法

伪代码

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
发布了10 篇原创文章 · 获赞 0 · 访问量 575

猜你喜欢

转载自blog.csdn.net/wweTHEUT/article/details/104213635