2012-10-16 107 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; 
}