分治算法--矩阵乘法

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    
___________
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值