1

假设我有一个 NxN 矩阵,其中包含 1 到 10 范围内的随机整数。现在,我想调用 PROC(A(1:n/2, 1:n/2)+A(n/2+1:n, n/2+1:n)...其中 n 是矩阵的大小。换句话说,我想从 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

iisrowStart-1和 j 是rowEnd-1你需要的i并且j从 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 回答