首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >矩阵乘法复制阵列指数超出界误差

矩阵乘法复制阵列指数超出界误差
EN

Stack Overflow用户
提问于 2015-03-30 05:02:03
回答 2查看 354关注 0票数 1

这是这里的第一篇文章,如果我的问题不符合要求的标准,请原谅我。

我编写了一段代码,它从两个独立的文件中获取两个矩阵的输入,并执行乘法并将数据输出到一个新文件中。

它给出了2x3或3x3矩阵的完美输出。如果输入4x4矩阵,将数组索引从绑定运行时异常中提取出来。我不明白为什么我会动态创建索引

我在第40行从绑定异常中得到一个数组索引。

我犯了个错误。

  1. 列表项目 公共类MM {私有BufferedReader br;私有int sum = 0;私有最终静态字符串matrixA="matrixA.txt";私有最终静态字符串matrixB="matrixB.txt";公共静态空主(String[] args) {新MM().MathMultiplicationValues(matrixA,matrixB);}私有空MathMultiplicationValues(String mat1,String mat2) { try { br =新BufferedReader(新FileReader(mat1));字符串行;int mat1rows = 0,mat1cols = 0,mat2rows = 0,mat2cols = 0;while (line=br.readLine() != null) { mat1cols = line.split(“").length + 1;mat1rows++;} br.close();//关闭文件br =新BufferedReader(新FileReader(mat2));//从文件中读取输入。时间((line = br.readLine()) != null) { mat2cols = line.split(“").length + 1;mat2rows++;} int mat1vals =新intmat1rows;int mat2vals =新intmat2rows;br.close();br =新BufferedReader(新FileReader(mat1));for (int i= 1;i< mat1rows + 1;i++) { line = br.readLine();String[] colvals = line.split(“");for (int j= 1;j< mat1cols;j++) { mat1valsi = Integer.parseInt(colvalsj - 1);} br.close();br =新BufferedReader(新FileReader(mat2));for (int i= 1;I< mat2rows + 1;i++) { line = br.readLine();String[] colvals = line.split(“");for (int j= 1;j< mat2cols;j++) { mat2valsi = Integer.parseInt(colvalsj - 1);} br.close();若((mat1cols-1) == mat2rows) { int =新intmat1rows + 1;for (int = 1;i< mat1rows + 1;i++) {//循环做矩阵乘法。(int j= 1;j< mat1cols;j++) { for (int k= 0;k< mat2rows + 1;k++) sum = sum + mat1valsi * mat2valsk;resltmati = sum;sum = 0;} final PrintWriter pw =新PrintWriter("Answer.txt");//创建一个名为矩阵应答的新文件。对于(int i= 1;i< mat1rows + 1;i++) { for (int j= 1;j< mat2cols;j++) { pw.print(resltmati +“");//写入输出以文件MatrixAnswer } pw.println();} pw.close();} else /如果不等于行的列中没有任何列传递给else块。System.out.println(“由于列不等于行而不可能实现矩阵的乘法”);} catch (除e外){ e.printStackTrace();}
EN

回答 2

Stack Overflow用户

发布于 2015-03-30 05:41:23

可能是因为这个

代码语言:javascript
运行
复制
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 i = 1; i < mat1rows + 1; i++)更改为for (int i = 1; i < mat1rows; i++)

票数 1
EN

Stack Overflow用户

发布于 2015-03-30 07:57:31

正如您在分配中使用的那样,结果矩阵的维度是mat1rows x mat2cols。因此,在resltmat[i][j]的计算中,索引i有界mat1rows (check),索引j有上界mat2cols (fail)。因此,将j的范围从mat1cols更改为mat2cols

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29338693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档