1

1 から 10 の範囲のランダムな整数でいっぱいの NxN 行列があるとします。PROC(A(1:n/2, 1:n/2)+A(n/2+1:n, n/2+1:n)...ここで、 n が行列のサイズである場所を呼び出したいと思います 。言い換えれば、A の最初の行と列から始まり、A の半分のサイズになるまで部分行列を作成し、それを A の半分のサイズから始まり、最後まで続く部分行列に追加したいと考えています。 A.

私が使用しているパーティション関数は次のとおりです。

public Matrix partition(int rowStart, int rowEnd, int colStart, int colEnd) {
    // int r = 0;
    // int c = 0;
    if (this.N%2 != 0) throw new RuntimeException("Illegal matrix dimensions.");
    Matrix C = new Matrix((this.N)/2);
    for (int i=rowStart-1; i<rowEnd; i++) {
        for (int j=colStart-1; j<colEnd; j++) {
            C.data[i][j] = this.data[i][j];
            // C.data[r][c] = this.data[i][j];
            c++;
        }
        r++;
    }
    return C;
}

これで、特定の行列の左上 ( Matrix C = m.partition(1, m.size()/2, 1, m.size()/2);) にある部分行列を見つけることができます。

 9.00     5.00     0.00     3.00
 0.00     7.00     8.00     3.00
 9.00     3.00    10.00     8.00
 0.00     6.00     2.00     0.00

 9.00     5.00
 0.00     7.00

しかし、別のサブマトリックス ( Matrix D = m.partition(m.size()/2+1, m.size(), m.size()/2+1, m.size());) を取得しようとすると、ArrayIndexOutOfBoundsException: 2. パーティション関数に個別の行カウンターと列カウンターを追加しようとしましたが、同じエラーが発生しました。パーティション関数を変更して、すべての入力で動作し、正しい出力が得られるようにするにはどうすればよいですか?

4

1 に答える 1

1
C.data[i][j] = this.data[i][j];<-- Culprit

irowStart-1j がrowEnd-1必要ij、0 から開始する必要がありますC.data

for (int i=rowStart-1,p=0; i<rowEnd; i++,p++) {
        for (int j=colStart-1,q=0; j<colEnd; j++,q++) {
            C.data[p][q] = this.data[i][j];
        }
    }
于 2012-10-04T14:35:44.657 に答える