Java中返回0的递归数组方法

Java中返回0的递归数组方法,java,arrays,matrix,Java,Arrays,Matrix,我接受了上一个问题的提示,并深入调试了我的代码。我仍在尝试制作一种方法,它将两个多维数组n*n相乘,就像它们是矩阵一样。但我遇到了一个奇怪的障碍。这是我的代码: public class subMatrix { public int[][] divcon(int[][] a, int[][] b, int sub) { int[][] matrixC = new int[a.length][a.length]; if (sub == 1) {

我接受了上一个问题的提示,并深入调试了我的代码。我仍在尝试制作一种方法,它将两个多维数组n*n相乘,就像它们是矩阵一样。但我遇到了一个奇怪的障碍。这是我的代码:

public class subMatrix {

    public int[][] divcon(int[][] a, int[][] b, int sub) {

        int[][] matrixC = new int[a.length][a.length];

        if (sub == 1) {
            matrixC[0][0] = a[0][0] * b[0][0];

        } else {
            sub = sub / 2;

            int[][] smalla11 = new int[sub][sub];
            int[][] smalla12 = new int[sub][sub];
            int[][] smalla21 = new int[sub][sub];
            int[][] smalla22 = new int[sub][sub];
            int[][] smallb11 = new int[sub][sub];
            int[][] smallb12 = new int[sub][sub];
            int[][] smallb21 = new int[sub][sub];
            int[][] smallb22 = new int[sub][sub];
            int[][] smallc11 = new int[sub][sub];
            int[][] smallc12 = new int[sub][sub];
            int[][] smallc21 = new int[sub][sub];
            int[][] smallc22 = new int[sub][sub];

            for (int i = 0; i < sub; i++) {
                for (int j = 0; j < sub; j++) {

                    smalla11[i][j] = a[i][j];
                    smalla12[i][j] = a[sub + i][j];
                    smalla21[i][j] = a[i][sub + j];
                    smalla22[i][j] = a[sub + i][sub + j];

                    smallb11[i][j] = b[i][j];
                    smallb12[i][j] = b[sub + i][j];
                    smallb21[i][j] = b[i][sub + j];
                    smallb22[i][j] = b[sub + i][sub + j];

                }
            }
            smallc11 = addMatrix(divcon(smalla11, smallb11, sub), divcon(smalla12, smallb21, sub), sub);
            smallc12 = addMatrix(divcon(smalla11, smallb12, sub), divcon(smalla12, smallb12, sub), sub);
            smallc21 = addMatrix(divcon(smalla21, smallb11, sub), divcon(smalla22, smallb21, sub), sub);
            smallc22 = addMatrix(divcon(smalla21, smallb12, sub), divcon(smalla22, smallb22, sub), sub);
        }
        return matrixC;
    }

    public int[][] addMatrix(int[][] aadd, int[][] badd, int size) {
        int[][] c = new int[size][size];

        for (int d = 0; d < size; d++) {
            for (int e = 0; e < size; e++) {

                c[d][e] = aadd[d][e] + badd[d][e];
            }
        }
        return c;
    }
}
公共类子矩阵{
公共int[]divcon(int[]a、int[]b、int sub){
int[][]matrixC=新的int[a.length][a.length];
if(sub==1){
matrixC[0][0]=a[0][0]*b[0][0];
}否则{
sub=sub/2;
int[][]smalla11=新int[sub][sub];
int[][]smalla12=新int[sub][sub];
int[][]smalla21=新int[sub][sub];
int[][]smalla22=新int[sub][sub];
int[][]smallb11=新int[sub][sub];
int[][]smallb12=新int[sub][sub];
int[][]smallb21=新int[sub][sub];
int[][]smallb22=新int[sub][sub];
int[][]smallc11=新int[sub][sub];
int[][]smallc12=新int[sub][sub];
int[][]smallc21=新int[sub][sub];
int[][]smallc22=新int[sub][sub];
对于(int i=0;i

矩阵a和b被分成四分之一。我用两个矩阵输入4x4调试代码,每个字段的值为2。直到某一时刻,事情都在朝着正确的方向发展。但是如果我添加一个
System.out.println()
来查看
smallc11、12、21和22的返回值,它有时会显示为0。怎么会?我从不输入任何0,数组的长度不应小于1,即2。

您正在返回
matrixC
,但您不会在任何地方更改它,因此它将充满
0

您可以复制所有子矩阵的结果,但最简单的方法是不首先创建它们。只需将两个原始矩阵的所有元素加在一起,就会更简单、更快

差不多

public double[][] multiply(double[][] a, double[][] b) {
     assert a[0].length == b.length;
     double[][]c = new double[a.length][b[0].length];
     for(int i = 0, len1 = a.length; i < len1; a++) {
         for(int j = 0, len2 = b[0].length; j < len2; j++) {
              double sum = 0.0;
              for(int k = 0, len3 = b.length; k < len3; k++)
                  sum += a[i][k] * b[k][j];
              c[i][j] = sum;
         }
     }
}
public double[][]乘法(double[]]a,double[]]b){
断言a[0]。长度==b.length;
double[]c=新的双精度[a.length][b[0]。length];
for(int i=0,len1=a.length;i
这要快得多的原因是创建新对象和复制值的成本超过了
*
+
的成本


您可以通过先转置
b
来进一步优化此设置,以提高缓存友好性。

请注意,使用简单的嵌套列表通常可以更轻松地解决此问题…int数组的所有元素的默认值为0,因此请检查您是否已成功设置any值。关于我解决此代码的方法,必须这样-在我们的算法类中,我们被要求实现这段代码,然后实现另一段代码,并比较运行时和算法分析。这确实是一条非常艰难的道路:P。。。关于你的答案——哦,我的好朋友,我不敢相信这就是它失败的原因。这么小又讨厌的一部分,我真该看看自己。我编写了一个类似的代码,将smallcs转换成matrixC,就像我将矩阵a和b转换成四分之一一样。我现在得到了正确的结果:D我会和其他数字核对一下。但是非常感谢大家帮我做这件事!:)在这种情况下,我会在您完成后(返回之前)将结果复制回matrixC。顺便说一句,您可以通过传递变量来说明要访问矩阵中的哪个位置,从而避免执行来回复制。这仍然要慢得多。如果您想用另一种方法进行比较,请尝试一种至少可能更快的Fork-Join实现。使用Fork-Join进行矩阵乘法的示例Google提供了更多信息和解释。我必须实现的另一个代码实际上只是通过传递有关矩阵索引的变量。。我们需要使用这两个版本。不过我还是会调查Fork Join的,谢谢:))