所以我写了一个程序,它将两个矩阵相乘,它运行正常。我只是在我的测试人员课程中以正确的方式打印正确答案时遇到问题,这是我的两个班级:
public class Tester {
public static void main(String[] args) {
// TODO Auto-generated method stub
int a[ ][ ]= new int[][]{ {1,2,-2,0} , {-3,4,7,2} , {6,0,3,1} };
int b[ ][ ]= new int[][]{ {-1,3} , {0,9} , {1,-11} , {4,-5} };
MatrixMult.mult(a,b);
System.out.println((MatrixMult.mult(a,b)));
}
}
和另一个:
import java.util.*;
public class MatrixMult {
public static int[][] mult(int a[][], int b[][]){
int[][] matrix= new int[3][2];
int i,j,k;
for(i = 0 ; i < 3 ; i++){
for( j = 0 ; j < 2 ; j++){
for (k = 0 ; k < 4 ; k++){
matrix[i][j] += (a[i][k]*b[k][j]);
}
//System.out.print(matrix[i][j] + "\t");
}
}
return matrix;
}
}
当我打印时,我明白了:
[[I@1948cc8c
我需要得到的是:
-3 43
18 -60
1 -20
答案 0 :(得分:0)
MatrixMult.mult()
会返回int[][]
。这就是你要打印的东西。
有两种方法可以解决这个问题。一种方法是将int[][]
保留为您正在使用的格式,然后打印出来。
更改Tester类以处理此问题:
public class Tester {
public static void main(String[] args) {
int a[ ][ ]= new int[][]{ {1,2,-2,0} , {-3,4,7,2} , {6,0,3,1} };
int b[ ][ ]= new int[][]{ {-1,3} , {0,9} , {1,-11} , {4,-5} };
int[][] result = MatrixMult.mult(a,b);
for(int[] i : result) {
for(int j : i) {
System.out.print(j);
System.out.print('\t');
}
System.out.println();
}
}
}
在这里,我们迭代结果,它给我们int数组,然后我们遍历那些int数组中的int,在每行之后打印一个新行。
另一种方法是创建一个包含toString()
方法的Matrix类(也可能是mult
方法)。
然后您将拥有如下代码:
public class Matrix {
private int[][] data;
public Matrix(int [][] arg) {
data = new int[arg.length][arg[0].length];
for(int i = 0; i < arg.length; i++) {
for(int j = 0; j < arg[0].length; j++) {
data[i][j] = arg[i][j];
}
}
}
public Matrix mult(Matrix arg) {
int[][] result;
/* arbtirary sized matrix multiplication code here */
return new Matrix(result);
}
public String toString() {
StringBuilder result = new StringBuilder();
for(int[] i : data) {
for(int j : i) {
result.append(j)
.append('\t');
}
result.append('\n');
}
return result.toString();
}
}
在这种方法中,您正在编写一个构造函数,然后将传入的数组复制到其自己的内部数据结构中,并且具有与循环的代码非常相似的toString,并打印出原始的int [] []结构。
然后构建一个StringBuilder并从中获取String。然后代码执行:
Matrix foo;
/* stuff */
System.out.println(foo);
将正常工作,因为打印它的调用将要求对象的字符串表示,并且已定义。