2017-11-22 2 views
0

Eine Matrix hebeln M der Größe nxn. Geteilt das M in subMatrix der Größe bxb. Wenn beispielsweise die n = 16 undb = 8, dann habe ich Submatrix der Größe 8x8 . Hier ist die Implementierung dieser Funktion funktioniert gut.Block für Block von großer Matrix lesen

public static int[][] getAcutalBlock(int[][] mat, int row, int col, int number) { 

    /* mat is orignal big matrix of size nxn 
    row is starting index for the block i 
    col is staring index for the block * 
    number is representing block ID either first block, second block or ... 
    */ 

    int[][] block = new int[blockSize][blockSize]; 
    int eRow = row + blockSize; 
    int eCol = col + blockSize; 

    if (number == 0) { // it is for first block 
     for (int i = row; i < eRow; i++) { 
      for (int j = col; j < eCol; j++) { 
       block[i][j] = mat[i][j]; 
      } 
     } 
    } 
    else if(number == totalBlocks-1){ // it is for last block 
     for (int i = row; i < eRow; i++) { 
      for (int j = col; j < eCol; j++) { 
       block[i - blockSize][j - blockSize] = mat[i][j]; 
      } 
     } 
    } 
    else if (isEven(number)) { // if the number is even 
     for (int i = row; i < eRow; i++) { 
      for (int j = col; j < eCol; j++) { 
       block[i - blockSize][j] = mat[i][j]; 
      } 
     } 
    } 
    else { // if the number is odd 
     for (int i = row; i < eRow; i++) { 
      for (int j = col; j < eCol; j++) { 
       block[i][j - blockSize] = mat[i][j]; 
      } 
     } 
    } 
    return block; 
} 

Aber das Problem ist, dass es nicht dynamisch ist. Wenn die b geändert wird, dann wie Zwischenblöcke mit Ausnahme ersten und letzten Block lesen? Ich möchte es generisch für eine beliebige Anzahl von n und eine beliebige Anzahl von b machen. Jedes Tutorial oder Codebeispiel wird geschätzt. Vielen Dank.

Antwort

0

Ich bin nicht sicher, ob ich die Frage verstehe, aber ich werde es versuchen.

Wenn ich das richtig die Zahl verstehen, ist die Darstellung, welche Untermatrix Sie zugreifen möchten und die col - und die Reihe -Variablen sind die jeweilige Position in dieser Matrix. So eine Darstellung der vier Submatrizen wäre so etwas wie

0 | 1 
------ 
2 | 3 

Mit der 9x9-Matrix sein, die wie

0 | 1 | 2 
---------- 
3 | 4 | 5 
---------- 
6 | 7 | 8 

Wenn dies der Fall ist, dann würde ich nur zwei verschachtelte machen for-Schleife wie Sie bereits für number == 0 aber hinzufügen, so dass die Matte -Matrix abgerufen das gewünschte Element durch eine Berechnung enthält Startindex für die Matrix und den aktuellen Index in der Schleife. Der Code könnte so etwas wie diese

int[][] block = new int[blockSize][blockSize]; 

// to get how many matrices that are put next to each other on a row 
int numbersOfSubMatricesPerSide = mat.length/blockSize; 

// starting position for this matrix column wise 
int colStart = (number % numbersOfSubMatricesPerSide) * blockSize; 

// starting position for this matrix row wise 
int rowStart = (number/numbersOfSubMatricesPerSide) * blockSize; 

// fill the sub-matrix 
for (int i = 0; i < blockSize; i++) { 
    for (int j = 0; j < blockSize; j++) { 
     block[i][j] = mat[colStart + i][rowStart + j]; 
    } 
} 

return block; 

So suchen sagen, wenn wir b = 10 und n = 30 hatten und wir wollten Matrix # 1 (Mitte oben), dann erstellen wir colStart = bekämen blockSize und rowStart = 0 bedeutet, dass wir für unseren Block die Daten von der Mat-Matrix mit Start um (BlockSize, 0) und endend in (2 * BlockSize - 1, BlockSize - 1)
=> sammeln würden beginnend bei (10, 0) und endend bei (19, 9).

Hoffe, das hilft!

+0

Sehr geehrte Cerise Charizard, es funktioniert für mich, danke für Ihre Bemühungen. –

Verwandte Themen