行列を4つの部分行列(等分)に分割するアルゴリズムを書いています。追加された画像に表示されるように、行列全体のサイズは常に4の乗数になります。気がついたら、2Dではなく1D要素のような要素にアクセスしようとしています。私は計算部分の間違いを理解できません。C - 行列を等分に分割する
#include <stdio.h>
/* Soner Akar - Algoritmayı alırsanız lütfen benden aldığınızı belirtin. */
enum { /*BLKSZ = 4*/ NBLOCKS = 4, SIZE = 16, BLKSZ = SIZE/NBLOCKS } ;
void get_slice(int arr[400], int slice[100], int sliceSize, int i, int j);
void get_slice(int arr[400], int slice[100], int sliceSize, int i, int j)
{
int k = 0;
int l = 0;
for(k = 0 ; k < sliceSize/2 ; ++k) { // calculation part
for (l = 0; l < sliceSize/2; ++l) {
slice[l + k * sliceSize/2] = arr[(l + j) + (k + i) * (sliceSize/2)];
printf("slice[%d][%d] -> %d ", k, l, slice[l + k * (sliceSize/2)]);
}
printf("\n");
}
printf("\n");
}
int main() {
int matrix[SIZE] ;
int block[BLKSZ];
int j = 0;
int i = 0;
for (j = 0; j < SIZE; ++j) {
matrix[j] = 1 + j;
}
for (i = 0; i < BLKSZ; ++i) {
for (j = 0; j < BLKSZ; ++j) {
printf("matrix[%d][%d] -> %d ", i, j, matrix[j + i * BLKSZ]);
}
printf("\n");
}
printf("\n");
printf("\n");
for(int i = 0 ; i < NBLOCKS ; ++i) // get all blocks (invariant: NBLOCKS == 4)
get_slice(matrix, block, SIZE/NBLOCKS ,BLKSZ*i/2, BLKSZ*i%2) ;
return 0;
}
出力:
matrix[0][0] -> 1 matrix[0][1] -> 2 matrix[0][2] -> 3 matrix[0][3] -> 4
matrix[1][0] -> 5 matrix[1][1] -> 6 matrix[1][2] -> 7 matrix[1][3] -> 8
matrix[2][0] -> 9 matrix[2][1] -> 10 matrix[2][2] -> 11 matrix[2][3] -> 12
matrix[3][0] -> 13 matrix[3][1] -> 14 matrix[3][2] -> 15 matrix[3][3] -> 16
slice[0][0] -> 1 slice[0][1] -> 2
slice[1][0] -> 3 slice[1][1] -> 4
slice[0][0] -> 5 slice[0][1] -> 6
slice[1][0] -> 7 slice[1][1] -> 8
slice[0][0] -> 9 slice[0][1] -> 10
slice[1][0] -> 11 slice[1][1] -> 12
slice[0][0] -> 13 slice[0][1] -> 14
slice[1][0] -> 15 slice[1][1] -> 16
Process finished with exit code 0
予想される出力:
slice[0][0] -> 1 slice[0][1] -> 2
slice[1][0] -> 5 slice[1][1] -> 6
slice[0][0] -> 3 slice[0][1] -> 4
slice[1][0] -> 7 slice[1][1] -> 8
slice[0][0] -> 9 slice[0][1] -> 10
slice[1][0] -> 13 slice[1][1] -> 14
slice[0][0] -> 11 slice[0][1] -> 12
slice[1][0] -> 15 slice[1][1] -> 16
ですか? – kdgregory