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

transposeメソッドのforループでの割り当ては次のようになります。-

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

それよりも: -

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

上記のコードでは、新しく作成された配列tempArrayからそれ自体にのみ値を割り当てています。それは意味がありません。アレイには影響しません。ArrayIndexOutOfBoundsまた、次の場合は例外をスローしますrow != col

転置したいマトリックスを使用する必要があります。

このメソッドを呼び出しているのでdoubleMatrix2

doubMatrix2 =transposeMatrix(num1,num2);

そして、あなたの2つのマトリックスは次のようになります:-

tempArray[][] = new double[num2][num1];

doubleMatrix[][] = new double[num1][num2];

したがって、に割り当てるのは理にかなっていdoubleMatrix[j][i]ますtempArray[i][j]。2つの行列で行と列の数が逆になっているためです。

于 2012-10-16T19:38:18.473 に答える
2

transposeMatrix関数で、num1とnum2の値が同じであることを表明する必要があります。それ以外の場合は、ArrayOutOfBoundになります。ロジックを確認するだけで、マトリックスの両方の次元で「i」と「j」の値を使用していることがわかります。したがって、両方が等しくなります。

于 2012-10-16T19:34:02.617 に答える
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 に答える
1

2次元配列は不規則な配列ではなく、同じ数の行と列が含まれていると想定していると思います。これは常に正しいとは限りません。

于 2012-10-16T19:36:29.590 に答える
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(またはと)が等しくない場合はどうiなりますか?ループをフラットにして、とjの定数値を使用してみましょう...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!

3番目の「ループ」で、アクセスしようとしていますtempArray[2][0]が、一時配列のサイズはとして定義されていdouble[2][3]ます。tempArray[2]それは、ましてや、がないことを意味しtempArray[2][0]ます。

于 2012-10-16T19:34:41.193 に答える
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 に答える