Это один первый пост здесь, извините меня, если мой вопрос не соответствует требуемым стандартам.
Я написал фрагмент кода, который принимает входные данные для двух матриц из двух отдельных файлов и выполняет умножение и вывод данных в новый файл.
Он дает идеальный выход для матрицы 2x3 или 3x3. Если я даю входные данные матрицы 4x4, я получаю индекс массива из исключенного исключения времени выполнения. Я не понимаю причину, так как я динамически создаю индекс
Я получаю индекс массива из связанного исключения в строке 40.
Я получаю сообщение об ошибке.
! [Snipet] [2]
Элемент списка
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();
}
}
}
Возможно, из-за этого
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++)
Как вы использовали в распределении, размерностью результирующей матрицы являются mat1rows
x mat2cols
. Таким образом, при вычислении resltmat[i][j]
индекс i
имеет связанную mat1rows
(check), а индекс j
имеет верхний mat2cols
(fail). Таким образом, измените диапазон j
от mat1cols
до mat2cols
.
resltmat = new int[mat1rows + 1][mat2cols + 1];
потому что это слишком много в обоих направлениях. Или, если это так, убедитесь, что все циклы основаны на 1, т. Е. Не начинаются с 0
.