矩阵乘法代码中数组索引越界异常
Array index out of bounds exception in matrix multiplication code
它一直抛出异常数组索引超出 multiply 方法的范围,但维度是正确的。错误出现在这一行:
mm[r][c]+=multiplier[i][j]*multiplicand[j][i];
并在这一行:
k.multiply_matrix(temp1,temp2,i1,h,i2);
我想知道为什么会抛出异常,以及我的代码是否可以修改为 运行 正确。
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class matrixmultiplication
{
public static void main(String args[])
{
matrixmultiplication k=new matrixmultiplication();
System.out.println("enter how many rows and how many columns");
Scanner c=new Scanner(System.in);
String f=c.next();
String[] x=f.split(",");
int i1=Integer.parseInt(x[0]);
int i2=Integer.parseInt(x[1]);
int[][] temp1=k.enter_thematrix(i1,i2);
System.out.println("how many columns in the second matrix");
int h=c.nextInt();
int[][] temp2=k.enter_thematrix(i2,h);
k.multiply_matrix(temp1,temp2,i1,h,i2);
}
public int[][] enter_thematrix(int d1,int d2)
{
Scanner c1=new Scanner(System.in);
int the_matrix[][]=new int[d1][d2];
for (int col=0;col<d2;col++)
{
for(int row=0;row<d1;row++)
{
the_matrix[row][col]=c1.nextInt();
}
}
return the_matrix;
}
public void print_matrix(int [][]mm,int a,int s)
{
for (int col=0;col<s;col++)
{
for(int row=0;row<a;row++)
{
System.out.print(mm[a][s]+"\t");
}
System.out.println();
}
}
public void multiply_matrix(int [][]multiplier,int [][]multiplicand,int r,int c,int innerd)
{
int [][]mm=new int[r][c];
for(int c1=0;c1<c;c1++)
{
for(int r1=0;r1<r;r1++)
{
for(int i=0;i<innerd;i++)
{
for(int j=0;j<innerd;j++)
{
mm[r][c]+=multiplier[i][j]*multiplicand[j][i];
}
}
}
}
print_matrix(mm,r,c);
}
}
问题是您将 i1
和 i2
传递给方法 multiply_matrix
。但是 i1
和 i2
是行数和列数。数组从零开始。因此,如果您有一个包含两行和两列的二维数组,它的最大索引将为 1。(0 和 1 是数组中的两个位置)因此,当您调用该行时:
mm[r][c]+=multiplier[i][j]*multiplicand[j][i];
您将始终遇到 indexoutofboundsexception,因为(在这个 2 x 2 数组的示例中)您将调用不存在的索引 (2,2)。您需要将参数 i1-1
和 i2-1
传递给该方法。
另请注意,我不会让用户在同一行输入行和列,然后将其拆分。这是容易出错的。如果用户输入一个数字、逗号、space,然后输入另一个数字,这将导致错误。或者,如果用户没有键入逗号,这也会导致错误。最好分两行调用 nextInt
。像这样:
System.out.println("enter how many rows: ");
Scanner c=new Scanner(System.in);
int i1 = c.nextInt();
System.out.println("Enter how many columns: ");
int i2 = c.nextInt();
它一直抛出异常数组索引超出 multiply 方法的范围,但维度是正确的。错误出现在这一行:
mm[r][c]+=multiplier[i][j]*multiplicand[j][i];
并在这一行:
k.multiply_matrix(temp1,temp2,i1,h,i2);
我想知道为什么会抛出异常,以及我的代码是否可以修改为 运行 正确。
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
public class matrixmultiplication
{
public static void main(String args[])
{
matrixmultiplication k=new matrixmultiplication();
System.out.println("enter how many rows and how many columns");
Scanner c=new Scanner(System.in);
String f=c.next();
String[] x=f.split(",");
int i1=Integer.parseInt(x[0]);
int i2=Integer.parseInt(x[1]);
int[][] temp1=k.enter_thematrix(i1,i2);
System.out.println("how many columns in the second matrix");
int h=c.nextInt();
int[][] temp2=k.enter_thematrix(i2,h);
k.multiply_matrix(temp1,temp2,i1,h,i2);
}
public int[][] enter_thematrix(int d1,int d2)
{
Scanner c1=new Scanner(System.in);
int the_matrix[][]=new int[d1][d2];
for (int col=0;col<d2;col++)
{
for(int row=0;row<d1;row++)
{
the_matrix[row][col]=c1.nextInt();
}
}
return the_matrix;
}
public void print_matrix(int [][]mm,int a,int s)
{
for (int col=0;col<s;col++)
{
for(int row=0;row<a;row++)
{
System.out.print(mm[a][s]+"\t");
}
System.out.println();
}
}
public void multiply_matrix(int [][]multiplier,int [][]multiplicand,int r,int c,int innerd)
{
int [][]mm=new int[r][c];
for(int c1=0;c1<c;c1++)
{
for(int r1=0;r1<r;r1++)
{
for(int i=0;i<innerd;i++)
{
for(int j=0;j<innerd;j++)
{
mm[r][c]+=multiplier[i][j]*multiplicand[j][i];
}
}
}
}
print_matrix(mm,r,c);
}
}
问题是您将 i1
和 i2
传递给方法 multiply_matrix
。但是 i1
和 i2
是行数和列数。数组从零开始。因此,如果您有一个包含两行和两列的二维数组,它的最大索引将为 1。(0 和 1 是数组中的两个位置)因此,当您调用该行时:
mm[r][c]+=multiplier[i][j]*multiplicand[j][i];
您将始终遇到 indexoutofboundsexception,因为(在这个 2 x 2 数组的示例中)您将调用不存在的索引 (2,2)。您需要将参数 i1-1
和 i2-1
传递给该方法。
另请注意,我不会让用户在同一行输入行和列,然后将其拆分。这是容易出错的。如果用户输入一个数字、逗号、space,然后输入另一个数字,这将导致错误。或者,如果用户没有键入逗号,这也会导致错误。最好分两行调用 nextInt
。像这样:
System.out.println("enter how many rows: ");
Scanner c=new Scanner(System.in);
int i1 = c.nextInt();
System.out.println("Enter how many columns: ");
int i2 = c.nextInt();