在Java中合并四个二维数组

3

我正尝试在Java中实现Strassen算法,目前需要将输出合并到一个单独的矩阵/二维数组中。我正在使用System.arraycopy 来复制数组,可以很好地实现上下连接两个数组,但是我还需要将它们并排连接,这里遇到了问题,会出现ArrayOutOfBoundsException。这是我的代码:

static int[][] Consolidate(int[][] c11, int[][] c12, int[][] c21, int[][] c22) {
    /* check size compatibility */
    if(c11[0].length == c21[0].length && 
            c11.length == c12.length &&
            c21.length == c22.length &&
            c22[0].length == c12[0].length) {
        int _rowSize = c11.length + c21.length;
        int _colSize = c11[0].length + c12[0].length;
        int[][] retArray = new int[_rowSize][_colSize];

        int[][] ltArray = new int[_rowSize][c11[0].length];
        int[][] rtArray = new int[_rowSize][c12[0].length];

        System.arraycopy(c11, 0, ltArray, 0, c11.length);
        System.arraycopy(c21, 0, ltArray, c11.length, c21.length);
        System.arraycopy(c12, 0, rtArray, 0, c12.length);
        System.arraycopy(c22, 0, rtArray, c12.length, c22.length);

        System.arraycopy(ltArray, 0, retArray, 0, ltArray.length);
        System.arraycopy(rtArray, 0, retArray, ltArray.length, rtArray.length);
        return retArray;
    }
    return null;
}

最后一行

System.arraycopy(rtArray, 0, retArray, ltArray.length, rtArray.length);

抛出异常。有没有一种方法可以将数组并排连接在一起(以列方式)?


2
@SiB 正如问题所述:ArrayOutOfBoundsException - Baz
2个回答

1

编辑 这是经过验证的答案

您可以手动复制最后一部分。

替换

System.arraycopy(ltArray, 0, retArray, 0, ltArray.length);
System.arraycopy(rtArray, 0, retArray, ltArray.length, rtArray.length);

使用

//Commented both calls
//System.arraycopy(ltArray, 0, retArray, 0, ltArray.length);
//System.arraycopy(rtArray, 0, retArray, ltArray.length, rtArray.length);
for (int row = 0; row < ltArray.length; row++) {
    int colInTarget = 0;
    for (int col = 0; col < ltArray[row].length; col++,colInTarget++) {
        retArray[row][colInTarget] = ltArray[row][col];
    }
    for (int col = 0; col < rtArray[row].length; col++,colInTarget++) {
        retArray[row][colInTarget] = rtArray[row][col];
    }
}

大小已正确计算,如int[][] retArray = new int[_rowSize][_colSize]所示。我认为问题在于Java试图将数组附加到retArray的底部(按行方式),而不是按列方式。我想知道是否有一种方法可以告诉Java以列方式附加。 - Vinay Pandey
如果没有其他办法,那我想我不得不加入循环,这是我一直试图避免的。感谢您的帮助! - Vinay Pandey

1

我想在Java中无法像Octave或Matlab那样逐列连接列。

这背后的原因是Java只支持一维数组。而矩阵是一个一维数组,其中每个元素也是一个数组(不一定要相同大小!)。

因此,在循环中逐个复制元素是最直接的解决方案。

private static int[][] consolidate(int[][] a, int[][] b, int[][] c, int[][] d) {
        int n = a.length * 2;
        int[][] result = new int[n][n];
        copy(result, a, 0, 0);
        copy(result, b, 0, n / 2);
        copy(result, c, n / 2, 0);
        copy(result, d, n / 2, n / 2);
        return result;
    }

    private static void copy(int[][] result, int[][] a, int m, int n) {
        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < a.length; j++) {
                result[m + i][n + j] = a[i][j];
            }
        }
    }

不一定是mishadoff,因为你可以通过引用复制一个数组。 - Czar Pino

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接