public class Matrix {
private double[][] a;
private double[][] b;
private double[][] c;
public Matrix(int aRows,int aCols,int bRows,int bCols){
if (aCols!=bRows){
throw new RuntimeException("矩阵的行和列不匹配,无法进行计算");
}
a=new double[aRows][aCols];
b=new double[bRows][bCols];
c=new double[aRows][bCols];
}
public void init(){
Random random=new Random();
for (int i=0;i<a.length;i++){
for (int j=0;j<a[i].length;j++){
a[i][j]= random.nextInt(10);
}
}
for (int i=0;i<b.length;i++){
for (int j=0;j<b[i].length;j++){
b[i][j]= random.nextInt(10);
}
}
}
public double[][] calculate(){
tt(0,a.length-1,0,a[0].length-1,0,b.length-1,0,b[0].length-1);
return c;
}
public void tt(int m1Y1,int m1Y2,int m1X1,int m1X2,int m2Y1,int m2Y2,int m2X1,int m2X2){
if (m1Y1>m1Y2 || m2X1>m2X2 || m1X1>m1X2 ||m2Y1>m2Y2){
return;
}
if (m1Y1==m1Y2 && m1X1==m1X2 && m2Y1==m2Y2 && m2X1==m2X2){
if (m1X1==m2Y1){
c[m1Y1][m2X1]+=a[m1Y1][m1X1]*b[m2Y1][m2X1];
}
}
else {//拆分数组
int midY=(m1Y2+m1Y1)/2;
int midX=(m1X2+m1X1)/2;
int midYY=(m2Y1+midX-m1X1);
int midXX=(m2X1+m2X2)/2;
tt(m1Y1,midY,m1X1,midX,m2Y1,midYY,m2X1,midXX);
tt(m1Y1,midY,m1X1,midX,m2Y1,midYY,midXX+1,m2X2);
tt(m1Y1,midY,midX+1,m1X2,midYY+1,m2Y2,m2X1,midXX);
tt(m1Y1,midY,midX+1,m1X2,midYY+1,m2Y2,midXX+1,m2X2);
tt(midY+1,m1Y2,m1X1,midX,m2Y1,midYY,m2X1,midXX);
tt(midY+1,m1Y2,m1X1,midX,m2Y1,midYY,midXX+1,m2X2);
tt(midY+1,m1Y2,midX+1,m1X2,midYY+1,m2Y2,m2X1,midXX);
tt(midY+1,m1Y2,midX+1,m1X2,midYY+1,m2Y2,midXX+1,m2X2);
}
}
public static void main(String[] args) {
Matrix matrix=new Matrix(3,3,3,3);
matrix.init();
matrix.calculate();
matrix.print(matrix.a);
matrix.print(matrix.b);
matrix.print(matrix.c);
}
public void print(double[][] temp){
for (double[] tempt:temp){
for (double t:tempt){
System.out.print(t+"\t");
}
System.out.println();
}
System.out.println("___________");
}
}
运行结果:
8.0 0.0 2.0
8.0 1.0 7.0
1.0 7.0 0.0
___________
3.0 0.0 4.0
8.0 8.0 2.0
5.0 8.0 5.0
___________
34.0 16.0 42.0
67.0 64.0 69.0
59.0 56.0 18.0
___________
第二次运行:
7.0 3.0 5.0 2.0
3.0 2.0 5.0 8.0
9.0 0.0 2.0 3.0
8.0 6.0 3.0 1.0
___________
8.0 0.0 0.0 5.0
2.0 1.0 9.0 3.0
9.0 3.0 8.0 1.0
2.0 7.0 5.0 5.0
___________
111.0 32.0 77.0 59.0
89.0 73.0 98.0 66.0
96.0 27.0 31.0 62.0
105.0 22.0 83.0 66.0
___________
分治算法--矩阵乘法
最新推荐文章于 2021-02-22 03:23:07 发布