2017-02-12 9 views
-1

double[][] 3x3行列(行列式を計算する)からサブ配列を取得しようとしています。私はArrayIndexOutOfBoundsExceptionを得続けます。2D double [] []配列からサブ配列を取得

理由は何ですか?

public double[][] get2DSubArray(double[][] largeArray, int rowStartIndex, int rowEndIndex, int columnStartIndex, int columnEndIndex) { 
    double[][] subArray = new double[rowEndIndex-rowStartIndex+1][columnEndIndex-columnStartIndex+1]; 
    for (int row = rowStartIndex; row < rowEndIndex; row++) { 
     subArray[row] = Arrays.copyOfRange(largeArray[row], columnStartIndex, columnEndIndex); 
    } 
    return subArray; 
} 
+0

どのインデックス値が例外となるのか知っていますか? –

+0

3x3の行列をインデックス(1,2,1,2)で入力すると例外が発生します(rowStartIndex = 1、rowEndIndex = 2など) –

+0

上記の入力で回答を更新しました。 –

答えて

1

は、それが配列の初期化とは何かを持っているように、メソッドに渡されたarrayは3×3ではないように見えます。例えば、例外を生成しない次の更新

public static void main(String[] args) throws IOException { 
    double[][] array = new double[][]{{1d,1d,1d},{2d,2d,2d},{3d,3d,3d}}; 
    double[][] subArray = get2DSubArray(array, 1, 2, 1, 2); 
    for(double[] arrayElement : subArray){ 
     for(double number : arrayElement){ 
      System.out.println(number); 
     } 
    } 
} 

public static double[][] get2DSubArray(double[][] largeArray, int rowStartIndex, int rowEndIndex, int columnStartIndex, 
     int columnEndIndex) { 
    double[][] subArray = new double[rowEndIndex - rowStartIndex + 1][columnEndIndex - columnStartIndex + 1]; 
    for (int row = rowStartIndex; row < rowEndIndex; row++) { 
     subArray[row] = Arrays.copyOfRange(largeArray[row], columnStartIndex, columnEndIndex); 
    } 
    return subArray; 
} 

上記溶液が例外を生成しないが、それは同様に正しい出力を生成しません。主に以下の理由:

    Arrays.copyOfRange方法について
  • 3番目の引数は、排他的であるので、我々はそれがループの
  • が唯一それが実行すべき一方の引数の提供セットに対して1回実行され動作するためにcolumnEndIndex+1を渡す必要があり、少なくとも二回
  • 代わりのsubArray[row]Arrays.copyOfRangeを割り当て、我々は解決策以下subArray[<zero based index>]

に割り当てる必要があり、作業を行います。

public double[][] get2DSubArray(double[][] largeArray, int rowStartIndex, int rowEndIndex, int columnStartIndex, 
     int columnEndIndex) { 
    double[][] subArray = new double[rowEndIndex - rowStartIndex + 1][columnEndIndex - columnStartIndex + 1]; 
    int index = 0; 
    for (int row = rowStartIndex; row <= rowEndIndex; row++) { 
     subArray[index++] = Arrays.copyOfRange(largeArray[row], columnStartIndex, columnEndIndex+1); 
    } 
    return subArray; 
} 
+0

新しい変数を作成するのではなく、rowStartIndexを引いたほうが効率的です。 – Locke

+0

ありがとうございます。私は 'row

1

行の開始が500だったと終点が505だった場合、forループ内の変数は、「サブアレイ[行優先で「=サブア​​レイの[行]を」交換したい500の代わりに、0から始まりますがrowStartIndex] = "コピーがより小さい配列のどこにあるのかと比べて、より大きな配列のどこにあるのかを参照しています。

編集:

//・バージョンに特化:

public static double[][] get2DSubArray(double[][] largeArray, int rowStartIndex, int rowEndIndex, int columnStartIndex, 
      int columnEndIndex) { 
     double[][] subArray = new double[rowEndIndex - rowStartIndex + 1][columnEndIndex - columnStartIndex + 1]; 
     for (int row = rowStartIndex; row <= rowEndIndex; row++) { 
      subArray[row-rowStartIndex] = Arrays.copyOfRange(largeArray[row], columnStartIndex, columnEndIndex+1); 
     } 
     return subArray; 
    } 
+0

私はそれを変更しましたが、まだ例外が発生しています。 2D配列に2番目の列があることを認識できないため、Eclipseは実際の行列(2D配列)を作成することを理解していないようです。ここに私の正確な出力があります(私はマトリックスを印刷して確実に動作することを確認しています)。http://imgur.com/a/lmEDF –