I'm writing an algorithm to divide a matrix into 4 submatrices(equipartitions). Size of the whole matrix is always multiplier of 4 as being shown in the added image. If you watch out, I'm trying to access elements like 1D element instead of 2D. I can't figure out the mistake at calculation part.
#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;
}
Output:
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
Expected output:
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