Матрица умножения при извлечении индекса массива вышла из связанной ошибки

1

Это один первый пост здесь, извините меня, если мой вопрос не соответствует требуемым стандартам.

Я написал фрагмент кода, который принимает входные данные для двух матриц из двух отдельных файлов и выполняет умножение и вывод данных в новый файл.

Он дает идеальный выход для матрицы 2x3 или 3x3. Если я даю входные данные матрицы 4x4, я получаю индекс массива из исключенного исключения времени выполнения. Я не понимаю причину, так как я динамически создаю индекс

Я получаю индекс массива из связанного исключения в строке 40.

Я получаю сообщение об ошибке.

! [Snipet] [2]

  1. Элемент списка

    public class MM {
    
    
    
    
    private BufferedReader br;
    private int sum = 0;
    private final static String matrixA="matrixA.txt"; 
    private final static String matrixB="matrixB.txt";
    
    public static void main(String[] args) {
        new MM().MathMultiplicationValues(matrixA, matrixB);
    }
    
    private void MathMultiplicationValues(String mat1, String mat2) {
        try {
            br = new BufferedReader(new FileReader(mat1));          
    
            String line;
            int mat1rows = 0, mat1cols = 0, mat2rows = 0, mat2cols = 0;
            while ((line = br.readLine()) != null) {
                mat1cols = line.split(" ").length + 1;
                mat1rows++;
            }
            br.close(); // To close file
            br = new BufferedReader(new FileReader(mat2)); // to read input from file.
            while ((line = br.readLine()) != null) {
                mat2cols = line.split(" ").length + 1;
                mat2rows++;
            }
            int[][] mat1vals = new int[mat1rows ][mat1cols ]; 
        int[][] mat2vals = new int[mat2rows ][mat2cols ]; 
            br.close();
            br = new BufferedReader(new FileReader(mat1));
            for (int i = 1; i < mat1rows + 1; i++) {
                line = br.readLine();
                String[] colvals = line.split(" ");
                for (int j = 1; j < mat1cols; j++) {
                    mat1vals[i][j] = Integer.parseInt(colvals[j - 1]);
    
                }
    
            }
    
    
            br.close();
            br = new BufferedReader(new FileReader(mat2));
            for (int i = 1; i < mat2rows + 1; i++) {
                line = br.readLine();
                String[] colvals = line.split(" ");
                for (int j = 1; j < mat2cols; j++) {
                    mat2vals[i][j] = Integer.parseInt(colvals[j - 1]);
    
                }
    
    
            }
    
            br.close();
            if ((mat1cols-1) == mat2rows) { 
                int[][] resltmat = new int[mat1rows + 1][mat2cols + 1];
                for (int i = 1; i < mat1rows + 1; i++) { //Loop does matrix multiplication. 
                    for (int j = 1; j < mat1cols; j++) {
                        for (int k = 0; k < mat2rows + 1; k++)
                            sum = sum + mat1vals[i][k] * mat2vals[k][j];
                        resltmat[i][j] = sum;
                        sum = 0;
                    }
                }
    
                final PrintWriter pw = new PrintWriter("Answer.txt"); //Creates a new file called Matrix Answer. 
                for (int i = 1; i < mat1rows + 1; i++) 
                {
    
                    for (int j = 1; j < mat2cols; j++) {
                        pw.print(resltmat[i][j] + " "); // Writes the output to file the file called MatrixAnswer
    
                    }
                    pw.println();
    
                }
                pw.close();
            } else // If no of columns not equal to rows control passes to else block. 
                System.out.println("Multiplication of Matrix is not possible because columns are not equal to rows");
    
        } catch (Exception e) {
            e.printStackTrace();
    
        }
    }
    
    }
    
  • 0
    У меня нет ответа для вас, но что может помочь, так это разделить (слишком длинный, на мой взгляд) метод (который в качестве альтернативы также должен быть назван в более низком camelCase) на более мелкие подпрограммы. Он не только будет более читабельным, но и позволит вам создавать меньшие модульные тесты, которые помогут вам точно определить источник ошибки.
Теги:
arrays
matrix
indexoutofboundsexception
filereader

2 ответа

1

Возможно, из-за этого

for (int i = 1; i < mat1rows + 1; i++) {
    line = br.readLine();
    String[] colvals = line.split(" ");
    for (int j = 1; j < mat1cols; j++) {
        mat1vals[i][j] = Integer.parseInt(colvals[j - 1]);

    }

}

i = mat1rows на последней итерации, которая является OOB. Изменить for (int я = 1; я < mat1rows + 1; i++) for (int я = 1; я < mat1rows; i++)

0

Как вы использовали в распределении, размерностью результирующей матрицы являются mat1rows x mat2cols. Таким образом, при вычислении resltmat[i][j] индекс i имеет связанную mat1rows (check), а индекс j имеет верхний mat2cols (fail). Таким образом, измените диапазон j от mat1cols до mat2cols.

  • 0
    Спасибо, Лутц. Ваш комментарий высоко ценится, но все же у меня есть проблема в коде
  • 0
    Ваш код в основном правильный, вам нужно только разобраться в правильных размерах и как включить их в границы цикла. Вам не нужно использовать resltmat = new int[mat1rows + 1][mat2cols + 1]; потому что это слишком много в обоих направлениях. Или, если это так, убедитесь, что все циклы основаны на 1, т. Е. Не начинаются с 0 .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню