【问题标题】:Array index out of bounds exception in matrix multiplication code [closed]矩阵乘法代码中的数组索引越界异常[关闭]
【发布时间】:2018-11-06 05:15:27
【问题描述】:

它不断抛出异常数组索引超出乘法方法的范围,但尺寸是正确的。错误出现在这一行:

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);
    }
}

【问题讨论】:

  • 报错时ijrc的值是多少?
  • 另外请提供minimal reproducible example。你有什么意见?
  • 您应该描述输入。作为一个有根据的猜测,我认为问题在于您正在反转行和列尺寸。
  • “但是尺寸是正确的” - 那么什么不正确?不要只是假设,调试。抛出异常时,您用来访问数组的变量的值是多少?这些数组的尺寸是多少?你看得到差别吗?在你的逻辑中,你试图访问数组边界之外的元素,为什么?
  • 教科书上的矩阵乘法通常是三折,innerd的目的是什么?

标签: java multidimensional-array indexoutofboundsexception


【解决方案1】:

问题是您将i1i2 传递给了方法multiply_matrix。但是i1i2 是行数和列数。数组从零开始。因此,如果您有一个包含两行两列的二维数组,它将具有最大索引 1。(0 和 1 是数组中的两个位置)所以当您调用该行时:

mm[r][c]+=multiplier[i][j]*multiplicand[j][i];

您将始终遇到 indexoutofboundsexception,因为(在此 2 x 2 数组示例中)您将调用不存在的索引 (2,2)。您需要将参数 i1-1i2-1 传递给方法。

另外,我不会让用户在同一行输入行和列然后拆分它。这很容易出错。如果用户输入一个数字、逗号、空格,然后输入另一个数字,这将导致错误。或者如果用户没有输入逗号,这也会导致错误。最好在两个单独的行上调用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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-01
    • 2018-04-12
    • 2016-08-03
    • 2016-01-04
    • 1970-01-01
    相关资源
    最近更新 更多