Соединить четыре двухмерных массива в Java
Я пытаюсь реализовать алгоритм Штрассена в Java, и я нахожусь на этапе, когда мне нужно объединить вывод в один матричный /2D массив. я использую 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 ответа
РЕДАКТИРОВАТЬ Вот проверенный ответ
Вы можете скопировать последнюю часть вручную.
замещать
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];
}
}
Я предполагаю, что нет способа объединить столбец за столбцом, как вы могли бы сделать это в октаве или в матлабе.
Причиной этого является поддержка одномерных массивов 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];
}
}
}