矩阵乘法(Strassen 算法实现)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014594922/article/details/78221347

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

}


展开阅读全文

没有更多推荐了,返回首页