Matrix在Java中返回错误的值

时间:2014-02-04 20:21:52

标签: java recursion matrix multiplication

我试图在java中创建一个方法,它使用整数作为参数将两个矩阵相乘,以告知矩阵在哪里工作,并递归地将矩阵“切片”到较小的部分,并使用所谓的Divide将它们从此处相乘和征服(这是一项学校的任务,尽管它确实是一种难以将两个矩阵相乘的方法!)。不出所料,在我的代码运行完毕后,matrice没有显示出我的期望。在我的主要方法中,我有3个大小为n * n(n = 2,4,8,16 ......)的矩阵,因此它们是正方形。我将矩阵A和B乘以矩阵D.我的主要方法是矩阵类。这就是我的代码现在的样子:

public class indexMult {
matrix mat = new matrix();


public void calc(int Ay, int Ax, int By, int Bx, int Dy, int Dx, int size){

    System.out.println(Ay +" "+ Ax +" "+ By +" "+ Bx +" "+ Dy +" "+ Dx +" "+ size);
    if(size==2){

        mat.D[Dy][Dx] = mat.A[Ay][Ax] * mat.B[By][Bx] + mat.A[Ay][Ax+1] * mat.B[By+1][Bx];
        mat.D[Dy+1][Dx] = mat.A[Ay+1][Ax] * mat.B[By][Bx] + mat.A[Ay+1][Ax+1] * mat.B[By+1][Bx];
        mat.D[Dy][Dx+1] = mat.A[Ay][Ax] * mat.B[By][Bx] + mat.A[Ay][Ax+1] * mat.B[By+1][Bx+1];
        mat.D[Dy+1][Dx+1] = mat.A[Ay+1][Ax] * mat.B[By][Bx+1] + mat.A[Ay+1][Ax+1] * mat.B[By+1][Bx];


    }else{

        size = size/2;  
        for(int i=0; i<size; i++){
            for(int j=0; j<size; j++){

                calc(i, j, i, j, i, j, size);
                calc(i, size+j, i, size+j, i, size+j, size);
                calc(size+i, j, size+i, j, size+i, j, size);
                calc(size+i, size+j, size+i, size+j, size+i, size+j, size);

            }   
        }           
    }
}               

}

此方法直接更改矩阵D.为了使它更容易,我在矩阵A和B中的每个位置都使用2个。我制定代码的方式也存在问题,因为结果不对 - 但我还没有解决这个问题。我在这一点上的问题是,无论我设置什么,D只填充5x5。如果我使用n作为4或2,我得到一个数组索引超出界限异常(因为我显然试图用5x5数据填充4x4矩阵)。但那不是我想要的代码!我的代码背后的想法是将n * n(int size)中的n除以2,并从此处对矩阵的每四分之一进行递归调用,直到大小为2x2并且我可以解决该部分。我可能缺少将四分之一矩阵加在一起的一块,但我还没那么远 - 我在填充整个矩阵时遇到麻烦,因为它在5x5之后停止。有人能够发现错误吗?

编辑:

在回答bellow的帮助下,以及我自己的一些补救措施,这个改变似乎有效 - 不仅是我的问题,而是实际计算我需要的东西! :))

calc(Ay, Ax, By, Bx, Dy, Dx, size);
        calc(Ay, Ax+size, By+size, Bx, Dy, Dx, size);

        calc(Ay, Ax, By, Bx+size, Dy, Dx+size, size);
        calc(Ay, Ax+size, By+size, Bx+size, Dy, Dx+size, size);

        calc(Ay+size, Ax, By, Bx, Dy+size, Dx, size);
        calc(Ay+size, Ax+size, By+size, Bx, Dy+size, Dx, size);

        calc(Ay+size, Ax, By, Bx+size, Dy+size, Dx+size, size);
        calc(Ay+size, Ax+size, By+size, Bx+size, Dy+size, Dx+size, size);

1 个答案:

答案 0 :(得分:0)

沿着这些方面可能会有所作为:

public class indexMult {
matrix mat = new matrix();


public void calc(int Ay, int Ax, int By, int Bx, int Dy, int Dx, int size){

    System.out.println(Ay +" "+ Ax +" "+ By +" "+ Bx +" "+ Dy +" "+ Dx +" "+ size);
    if(size==2){

        mat.D[Dy][Dx] = mat.A[Ay][Ax] * mat.B[By][Bx] + mat.A[Ay][Ax+1] * mat.B[By+1][Bx];
        mat.D[Dy+1][Dx] = mat.A[Ay+1][Ax] * mat.B[By][Bx] + mat.A[Ay+1][Ax+1] * mat.B[By+1][Bx];
        mat.D[Dy][Dx+1] = mat.A[Ay][Ax] * mat.B[By][Bx] + mat.A[Ay][Ax+1] * mat.B[By+1][Bx+1];
        mat.D[Dy+1][Dx+1] = mat.A[Ay+1][Ax] * mat.B[By][Bx+1] + mat.A[Ay+1][Ax+1] * mat.B[By+1][Bx];


    }else{

        size = size/2;  
        calc(Ay, Ax, By, Bx, Dy, Dx, size);
        calc(Ay, Ax+size, By, Bx+size, Dy, Dx+size, size);
        calc(Ay+size, Ax, By+size, Bx, Dy+size, Dx, size);
        calc(Ay+size, Ax+size, By+size, Bx+size, Dy+size, Dx+size, size);
    }
}

我刚用递归替换了循环,只是简单地递归。