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

}

我在运行这个程序时遇到问题,没有错误,但是当我运行它时,它说数组索引超出范围,问题出在转置方法上,谁能告诉我如何解决这个问题?

4

6 回答 6

3

方法的for循环中的赋值transpose应该是这样的: -

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]。因为两个矩阵中的行数和列数是相反的。

于 2012-10-16T19:38:18.473 回答
2

在您的 transposeMatrix 函数中,您必须断言 num1 和 num2 具有相同的值。以任何其他方式,它会导致一个 ArrayOutOfBound,只需检查你的逻辑,你会发现你在矩阵的两个维度中都使用了“i”和“j”值,所以它们都必须相等。

于 2012-10-16T19:34:02.617 回答
1

我认为您假设您的二维数组不是参差不齐的数组,并且它包含相同数量的行和列。这并不总是正确的。

于 2012-10-16T19:36:29.590 回答
1

您的问题是以下行:

tempArray[i][j] = tempArray[j][i];

变量 j 的范围可以从 0 到 tempArray[i].length。但是,您正在使用它来索引 tempArray 本身 (tempArray[j][i])。所以如果 j 大于 tempArray.length,你会得到一个错误。

此外,该函数似乎没有做任何事情,因为 tempArray 中没有任何内容。

于 2012-10-16T19:34:42.477 回答
0

在转置矩阵方法中,您正在就地转置。这意味着您正在尝试在不使用任何新数组的情况下替换元素。此外,使用 num1 * num2 大小初始化的 tempArray 没有在方法 transposeMatrix 中初始化的任何值。

我建议如下:

  1. 将数组传递给要转置的转置方法。可以说,这有 m 行和 n 列
  2. 创建一个大小为 n 行 m 列的新数组
  3. 现在使用 for 循环将 array1[i][j] 复制到 array2[j][i]。

超出范围的索引很明显,因为尽管 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;
}
于 2012-10-16T19:43:22.777 回答
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]); 
        }
    }

那么当num2and num1(或iand 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]

于 2012-10-16T19:34:41.193 回答