2012-10-04 55 views
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的大小的一半加1開始的子矩陣並且一直延續到A.Strassen算法的矩陣分區

,我使用的分區函數是這樣的:

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。我試過向分區函數添加單獨的行和列計數器,但它給出了相同的錯誤。我如何修改我的分區函數以處理所有輸入並仍然輸出正確的輸出?

回答

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

irowStart-1和j是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]; 
     } 
    }