Зачем индексировать исключение за пределами при добавлении двух двумерных массивов? - PullRequest
0 голосов
/ 08 мая 2020

Я хочу сложить две матрицы и вернуть новую матрицу. Пример: matrixAdd ({{1, 2, 3}, {4, 4, 4}}, {{5, 5, 6}, {0, -1, 2}}) ожидается возврат: {{6, 7 , 9}, {4, 3, 6}}. Я не могу понять, почему мой код генерирует исключение индекса за пределами границ ... Кстати, массивы, переданные как параметры, всегда будут иметь одинаковые размеры, поэтому мне не нужно об этом беспокоиться.

public static int[][] matrixAdd(int[][]a, int[][]b){    
    int[][]matrix = new int[a.length][b.length];
    for(int r=0; r<a.length; r++){
        for(int c=0; c<a[r].length; c++){
            matrix[r][c] = a[r][c] + b[r][c];
        }
    }
    return matrix;
}

Ответы [ 3 ]

2 голосов
/ 08 мая 2020

Потому что вы используете b.length как в matrix create.

Это означает, что для ваших данных это похоже на int[][]matrix = new int[2][2];, но вам нужно int[][]matrix = new int[2][3]

Вы можете использовать что-то вроде этого

int[][]matrix = new int[a.length][a[0].length];
0 голосов
/ 08 мая 2020

Попробуйте следующий код:

public static int[][] matrixAdd(int[][]a, int[][]b){
        int[][]matrix = new int[a.length][b[0].length];
        for(int r=0; r<a.length; r++){
            for(int c=0; c<a[r].length; c++){
                matrix[r][c] = a[r][c] + b[r][c];
            }
        }
        return matrix;
    }
0 голосов
/ 08 мая 2020

Вот и проблема

int[][]matrix = new int[a.length][b.length];

Матрицы a и b имеют размер 2X3. Так что новая матрица, созданная ими, тоже будет размером 2x3. Но заявленная матрица матрица имеет размер 2X2, так как a.length и b.length оба возвращают 2.

Как вы уже упоминали, размер матрицы всегда одинаков, вы можете сделать следующее.

int[][]matrix = new int[2][3];

Если это динамика c, выполните следующие действия

  int[][]matrix = new int[a.length][a[0].length];
...