2017-11-22 16 views
0

行列を浮かべるMサイズnxnそのMをサブマトリクスのサイズbxbに分割しました。例えば、N = 16B = 8場合、私はサイズ8×8の部分行列を有しています。ここでその関数の実装はうまく動作しています。ブロックを大行列からブロックごとに読み取る

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; 
} 

しかし、問題は動的ではないということです。 bが変更された場合、以外の中間ブロックを読み取る方法最後ブロック?私はnの任意の数と任意の数のbのためにそれを一般的にしたいと思います。 チュートリアルやコードのサンプルをご利用いただけます。ありがとう。

答えて

0

私は質問を理解するかどうか分かりませんが、試してみます。 - 変数は、その行列の各位置であり、行 - 私はこれを正しく理解していれば

は数がアクセスしたいどのサブ行列の表現とCOLです。これは、私は唯一のforループ2ネスト作りたい場合であればそれで4つの部分行列の表現は

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

のように見える9x9の行列で

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

ようなものになるだろうすでにの数字== 0のために既に行っていたように、追加すると、マット -matrixは、行列の開始インデックスとループ内の現在のインデックスを含む計算によって目的の要素を取得しました。コードはこの

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; 

のようになりますので、=我々は、B = 10のn = 30を持っていたし、我々は、マトリックス#1(中央上)作成したいならば、我々はcolStartを取得したいと言いますblockSizerowStart = 0私たちのブロックでは、start(blockSize、0)と(2 * blockSize - 1、blockSize - 1)で終わるマットマトリクスからデータを収集することを意味します。
=> (10、0)から始まり、(19、9)で終わる。

希望すると便利です。

+0

Cerise Charizard様、私はあなたの努力に感謝しています。 –

関連する問題