我试图在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);
答案 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);
}
}
我刚用递归替换了循环,只是简单地递归。