问题描述和基本概念见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 stub
int 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();
}
}
}