斯特拉森矩陣乘法

先上代碼
package Sort;
public class Matrix {

	public static void main(String[] args) {
		int[][] cc={{1,1,1,1,1,1,1,1},{1,1,1,1,1,1,1,1},{1,1,1,1,1,1,1,1},{1,1,1,1,1,1,1,1},{1,1,1,1,1,1,1,1},{1,1,1,1,1,1,1,1},{1,1,1,1,1,1,1,1},{1,1,1,1,1,1,1,1}};
		int[][] e =new Matrix().multiMatrix(cc,cc);
		for(int i=0;i<e.length;i++)
		{
			for(int j=0;j<e.length;j++)
				System.out.print(e[i][j]+" ");
			System.out.println();
		}
		
	}
	int[][] multiMatrix(int[][] x,int[][] y)//矩陣的乘法
	{
		Matrix matr=new Matrix();
		int a=x.length/2;
		if(x.length==2)
		{
			int m1=(x[0][1]-x[1][1])*(y[1][0]+y[1][1]),
				m2=(x[0][0]+x[1][1])*(y[0][0]+y[0][1]),
				m3=(x[1][0]-x[0][0])*(y[0][0]+y[0][1]),
				m4=(x[0][0]+x[0][1])*y[1][1],
				m5=x[0][0]*(y[0][1]-y[1][1]),
				m6=x[1][1]*(y[1][0]-y[0][0]),
				m7=(x[1][0]+x[1][1])*y[0][0];
			int[][] c=new int[2][2];
			c[0][0]=m1+m2+m6-m4;
			c[0][1]=m4+m5;
			c[1][0]=m6+m7;
			c[1][1]=m2+m3+m5-m7;
			return c;			
		}
		else
		{
			int[][] a11=new Matrix().sepaMatr(x, 0, 0);
			int[][] a12=new Matrix().sepaMatr(x, 0, a);
			int[][] a21=new Matrix().sepaMatr(x, a, 0);
			int[][] a22=new Matrix().sepaMatr(x, a, a);
			int[][] b11=new Matrix().sepaMatr(y, 0, 0);
			int[][] b12=new Matrix().sepaMatr(y, 0, a);
			int[][] b21=new Matrix().sepaMatr(y, a, 0);
			int[][] b22=new Matrix().sepaMatr(y, a, a);
			int[][] m1=matr.multiMatrix(matr.operaMatr(a11,a22,'-'),matr.operaMatr(b21,b22,'+')),
					m2=matr.multiMatrix(matr.operaMatr(a11, a22, '+'), matr.operaMatr(b11, b22, '+')),
					m3=matr.multiMatrix(matr.operaMatr(a21, a11, '-'),matr.operaMatr(b11, b12,'+')),
					m4=matr.multiMatrix(matr.operaMatr(a12, a11, '+'), b22),
					m5=matr.multiMatrix(a11,matr.operaMatr(b12, b22,'-')),
					m6=matr.multiMatrix(a22, matr.operaMatr(b21, b11, '-')),
					m7=matr.multiMatrix(matr.operaMatr(a21, a22, '+'), b11);
			int[][] c11=matr.operaMatr(matr.operaMatr(m6, m4, '-'),matr.operaMatr(m1, m2, '+'),'+');
			int[][] c12=matr.operaMatr(m4, m5, '+');
			int[][] c21=matr.operaMatr(m6, m7, '+');
			int[][] c22=matr.operaMatr(matr.operaMatr(m2, m3, '+'),matr.operaMatr(m5, m7, '-'),'+');
			return matr.mergMatr(c11, c12, c21, c22);				
			
		}
	}
	
	int[][] mergMatr(int[][] x11,int[][] x12,int[][] x21,int[][] x22 )//和並舉證,將c11,c12,c21,c22合併成一個矩陣
	{
		int[][] a=new int[2*x11.length][2*x11.length];
		for(int i=0;i<x11.length;i++)
			for(int j=0;j<x11.length;j++)
			{
				a[i][j]=x11[i][j];
			}
		for(int i=0;i<x11.length;i++)
			for(int j=0;j<x11.length;j++)
			{
				a[i][j+x11.length]=x12[i][j];
			}
		for(int i=0;i<x11.length;i++)
			for(int j=0;j<x11.length;j++)
			{
				a[i+x11.length][j]=x21[i][j];
			}
		for(int i=0;i<x11.length;i++)
			for(int j=0;j<x11.length;j++)
			{
				a[i+x11.length][j+x11.length]=x22[i][j];
			}
		return a;
	}
	
	int[][] sepaMatr(int[][] x,int m,int n)//分解矩陣成矩陣塊
	{
		int[][] a=new int[x.length/2][x.length/2];
		for(int i=0;i<a.length;i++)
			for(int j=0;j<a.length;j++)
			{
				a[i][j]=x[m+i][n+j];
			}
		return a;		
	}
	int[][] operaMatr(int[][] x,int[][] y,char f)//矩陣的加減
	{
		if(f=='+')
		{
			int[][] a=new int[x.length][x.length];
			for(int i=0;i<x.length;i++)
				for(int j=0;j<x.length;j++)
					a[i][j]=x[i][j]+y[i][j];
		    return a;
		}
		else if(f=='-')
		{
			int[][] a=new int[x.length][x.length];
			for(int i=0;i<x.length;i++)
				for(int j=0;j<x.length;j++)
					a[i][j]=x[i][j]-y[i][j];
			return a;
		}
		else
		{
			System.out.println("error");
			int[][] a=new int[1][1];
			return a;
		}
	}

}
其中的矩陣乘法這一塊還有很大的改進。等我改好了到時候再傳上來。
當n>36時,斯特拉森法相比於普通方法能節省很多時間

。。。。我是爲了練習遞歸才寫這個的,遞歸好難啊。。。。可是寫出來再看卻覺得自己爲什麼這麼笨。。。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章