public class Homework2 {
public static void main(String[] args){
int num1 = (int) (Math.random()*(10-3+1)+3);
int num2 = (int) (Math.random()*(10-3+1)+3);
double[][] doubMatrix1 = new double[num1][num2];
double[][] doubMatrix2 = new double[num1][num2];
double[][] doubMatrix3 = new double[num1][num2];
doubMatrix1 = getdoubMatrix(num1,num2);
doubMatrix2 = getdoubMatrix(num1,num2);
doubMatrix3 = addMatrices(doubMatrix1, doubMatrix2, num1, num2);
printDoubMatrix("First matrix", doubMatrix1);
printDoubMatrix("Second matrix", doubMatrix2);
printDoubMatrix("Result of adding", doubMatrix3);
doubMatrix2 =transposeMatrix(num1,num2);
}
public static double[][] getdoubMatrix(int num1,int num2){
double[][] tempArray = new double[num1][num2];
for(int i = 0;i < tempArray.length;i++)
for(int j = 0;j < tempArray[i].length;j++)
{
tempArray[i][j] = Math.random() * (100);
}
return tempArray;
}
public static double[][] addMatrices(double[][] doubMatrix1, double[][] doubMatrix2,int num1,int num2)
{
double[][] tempArray = null;
if(doubMatrix1.length == doubMatrix2.length)
if(doubMatrix1[0].length == doubMatrix2[0].length)
{
tempArray = new double[num1][num2];
for(int i = 0; i< doubMatrix1.length;i++)
for(int j = 0; j< doubMatrix1[i].length;j++ )
{
tempArray[i][j] = doubMatrix1[i][j] + doubMatrix2[i][j];
}
}
else
{
return tempArray = new double[0][0];
}
return tempArray;
}
public static void printDoubMatrix(String text,double[][] doubMatrix1){
System.out.println(text);
for(int i = 0; i< doubMatrix1.length;i++)
for(int j = 0; j< doubMatrix1[i].length;j++ )
System.out.printf("%f\n", doubMatrix1[i][j]);
}
public static double[][] transposeMatrix(int num1, int num2){
double[][] tempArray = new double[num2][num1];
for(int i = 0;i < tempArray.length;i++)
for(int j = 0;j < tempArray[i].length;j++)
{
tempArray[i][j] = tempArray[j][i];
System.out.printf("%f\n", tempArray[i][j]);
}
return tempArray;
}
}
我在运行这个程序时遇到问题,没有错误,但是当我运行它时说数组索引超出限制,问题出在transpose方法,有谁能告诉我如何解决这个问题?< / p>
答案 0 :(得分:3)
transpose
方法的for循环中的赋值应该是: -
tempArray[i][j] = doubleMatrix2[j][i];
而不是: -
tempArray[i][j] = tempArray[j][i];
在上面的代码中,您只是将新创建的数组tempArray
中的值赋给自己。这没有意义。它不会影响数组。如果ArrayIndexOutOfBounds
row != col
例外
您需要使用要转置的矩阵。
因为您正在为doubleMatrix2
doubMatrix2 =transposeMatrix(num1,num2);
你的两个矩阵就像: -
tempArray[][] = new double[num2][num1];
doubleMatrix[][] = new double[num1][num2];
因此,将doubleMatrix[j][i]
分配给tempArray[i][j]
是有意义的。因为行数和列数在两个矩阵中相反。
答案 1 :(得分:2)
答案 2 :(得分:1)
您的问题如下:
tempArray[i][j] = tempArray[j][i];
变量j的范围可以从0到tempArray [i] .length。但是,您正在使用它来索引tempArray本身(tempArray [j] [i])。因此,如果j大于tempArray.length,您将收到错误。
此外,该函数似乎没有做任何事情,因为tempArray中没有任何内容。
答案 3 :(得分:1)
我认为你假设你的二维数组不是一个参差不齐的数组,它包含相同数量的行和列。但并非总是如此。
答案 4 :(得分:0)
我的猜测是问题出现在这个循环中 - 有时只会发生。
double[][] tempArray = new double[num2][num1];
for(int i = 0;i < tempArray.length;i++) {
for(int j = 0;j < tempArray[i].length;j++) {
tempArray[i][j] = tempArray[j][i];
System.out.printf("%f\n", tempArray[i][j]);
}
}
那么当num2
和num1
(或i
和j
)不相等时会发生什么?让我们展平循环并使用num1
和num2
...
double[][] tempArray = new double[2][5];
// i=0, j=0
tempArray[0][0] = tempArray[0][0];
System.out.printf("%f\n", tempArray[0][0]);
// i=0, j=1
tempArray[0][1] = tempArray[1][0];
System.out.printf("%f\n", tempArray[0][1]);
// i=0, j=2
tempArray[0][2] = tempArray[2][0]; // Array index out of bounds!
在第三个“循环”中,您尝试访问tempArray[2][0]
- 但临时数组的大小定义为double[2][3]
。这意味着没有tempArray[2]
,更不用说tempArray[2][0]
。
答案 5 :(得分:0)
在转置矩阵方法中,您可以就地转置。这意味着您尝试在不使用任何新数组的情况下替换元素。此外,初始化为num1 * num2大小的tempArray没有在transposeMatrix方法中初始化的任何值。
我建议如下:
索引超出范围是显而易见的,因为虽然tempArray [i] [j]对所有情况都有效,但tempArray [j] [j]不是
以下是您可以尝试的示例代码:
//assuming array1 is of size num1 * num2
public static double[][] transposeMatrix(int num1, int num2, double[][] array1){
double[][] tempArray = new double[num2][num1];
for(int i = 0;i < num1;i++)
for(int j = 0;j < num2;j++)
{
tempArray[j][i] = array1[i][j];
//System.out.printf("%f\n", tempArray[j][i]);
}
return tempArray;
}