矩阵乘法(Strassen 算法实现)

来源:互联网 发布:linux文件内容复制 编辑:程序博客网 时间:2024/04/18 09:57

问题描述和基本概念见http://www.mamicode.com/info-detail-673908.html

实现代码如下:

package algorithm;import java.util.Random;public class Algorithm {static int[][] MatrixPlus(int M1[][],int M2[][],int n,int flag){int M[][]=new int[n][n];for(int i=0;i<n;i++)for(int j=0;j<n;j++){if(flag==1)//加法M[i][j]=M1[i][j]+M2[i][j];else if(flag==-1)//减法M[i][j]=M1[i][j]-M2[i][j];}return M;}static int[][] MatrixMultiplication(int M1[][],int M2[][],int n){int M[][]=new int[n][n];if(n<=2){int p1=M1[0][0]*(M2[0][1]-M2[1][1]);int p2=(M1[0][0]+M1[0][1])*M2[1][1];int p3=(M1[1][0]+M1[1][1])*M2[0][0];int p4=M1[1][1]*(M2[1][0]-M2[0][0]);int p5=(M1[0][0]+M1[1][1])*(M2[0][0]+M2[1][1]);int p6=(M1[0][1]-M1[1][1])*(M2[1][0]+M2[1][1]);int p7=(M1[0][0]-M1[1][0])*(M2[0][0]+M2[0][1]);M[0][0]=p4+p5+p6-p2;M[0][1]=p1+p2;M[1][0]=p3+p4;M[1][1]=p1+p5-p3-p7;}else{int k=n/2;int M00[][]=new int[k][k];int M01[][]=new int[k][k];int M10[][]=new int[k][k];int M11[][]=new int[k][k];int A00[][]=new int[k][k];int A01[][]=new int[k][k];int A10[][]=new int[k][k];int A11[][]=new int[k][k];int B00[][]=new int[k][k];int B01[][]=new int[k][k];int B10[][]=new int[k][k];int B11[][]=new int[k][k];for(int i=0;i<k;i++){for(int j=0;j<k;j++){A00[i][j]=M1[i][j];A01[i][j]=M1[i][j+k];A10[i][j]=M1[i+k][j];A11[i][j]=M1[i+k][j+k];B00[i][j]=M2[i][j];B01[i][j]=M2[i][j+k];B10[i][j]=M2[i+k][j];B11[i][j]=M2[i+k][j+k];}}int p1[][]=MatrixMultiplication(A00,MatrixPlus(B01,B11,k,-1),k);int p2[][]=MatrixMultiplication(MatrixPlus(A00,A01,k,1),B11,k);int p3[][]=MatrixMultiplication(MatrixPlus(A10,A11,k,1),B00,k);int p4[][]=MatrixMultiplication(A11,MatrixPlus(B10,B00,k,-1),k);int p5[][]=MatrixMultiplication(MatrixPlus(A00,A11,k,1),MatrixPlus(B00,B11,k,1),k);int p6[][]=MatrixMultiplication(MatrixPlus(A01,A11,k,-1),MatrixPlus(B10,B11,k,1),k);int p7[][]=MatrixMultiplication(MatrixPlus(A00,A10,k,-1),MatrixPlus(B00,B01,k,1),k);M00=MatrixPlus(MatrixPlus(MatrixPlus(p4,p5,k,1),p6,k,1),p2,k,-1);M01=MatrixPlus(p1,p2,k,1);M10=MatrixPlus(p3,p4,k,1);M11=MatrixPlus(MatrixPlus(MatrixPlus(p1,p5,k,1),p3,k,-1),p7,k,-1);for(int i=0;i<k;i++){for(int j=0;j<k;j++){M[i][j]=M00[i][j];M[i][j+k]=M01[i][j];M[i+k][j]=M10[i][j];M[i+k][j+k]=M11[i][j];}}}return M;}public static void main(String[] args) {// TODO Auto-generated method stubint N=4;int M1[][]=new int[N][N];int M2[][]=new int[N][N];int M[][]=new int[N][N];Random r=new Random();for(int i=0;i<N;i++){for(int j=0;j<N;j++){M1[i][j]=r.nextInt(10)%10;System.out.print(M1[i][j]+" ");}System.out.println();}System.out.println();for(int i=0;i<N;i++){for(int j=0;j<N;j++){M2[i][j]=r.nextInt()%10;System.out.print(M2[i][j]+" ");}System.out.println();}M=MatrixMultiplication(M1,M2,N);System.out.println();for(int i=0;i<N;i++){for(int j=0;j<N;j++){System.out.print(M[i][j]+" ");}System.out.println();}}}


原创粉丝点击