2012-10-16 105 views
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

“没有错误,但当我运行它时,它说数组索引超出了界限”=>听起来像是一个错误! –

+0

我刚刚运行了这段代码,没有错误 –

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

+0

+1为了进一步说明如何解决转置算法 – betomontejo

2

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

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

num2num1(或ij)不等于会发生什么?让我们扁平化的循环,并使用常量值num1num2 ...

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]

1

您的问题是下列行:

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

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

此外,由于tempArray中没有任何内容,因此该函数看起来不会执行任何操作。

+1

+1最快的枪! –

+0

@assylias,你是对的。我最初认为它是以一个数组作为输入,在这种情况下,改变这些元素将起作用。考虑到函数将相同(未初始化)的矩阵置换,那么它不起作用。 –

1

我认为你假设你的二维数组不是一个不整齐的数组,并且它包含相同数量的行和列。这并非总是如此。

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