8x8块上的L1xL2阵列

时间:2014-05-05 14:18:58

标签: c arrays block

给定一个大小为L1xL2的数组将数组除以4x4的块。例如,阵列的大小是8x8,因此将有4个4x4的块。 这是一个例子:

1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 5 5 5 5 6 6 6 6 7 7 7 7 8 8 8 8
............... 

第一块4x4将是:

1 1 1 1 3 3 3 3 5 5 5 5 7 7 7 7

第二个区块将是:

2 2 2 2 4 4 4 4 6 6 6 6 8 8 8 8

我写了这段代码(我有一个存储为数组的矩阵,它的大小是8 * 8):

for (p = 0; p < nr_blocks; p ++) { 
    for (i = p*4; i < p*4 + 4; i++) {
        for (j = 0; j < 4; j++) {
            printf(" %d ", array[i*4 + j]);
        }
    }
}

但是这段代码采用了这样的第一个块:

1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4

我想分割所有块并打印它们=&gt; 4个街区。

出了什么问题?

3 个答案:

答案 0 :(得分:0)

当您的数组存储8x8矩阵时,您需要使用维度8访问它。

for(p = 0; p < nr_blocks; p ++){ 
    for(i = p*nr_blocks; i < p*nr_blocks + 4; i++) { // please note the change
        for(j = 0; j < 4; j++){
            printf(" %d ", array[i*4 + j]);
        }
        printf("\n");
    }
}

答案 1 :(得分:0)

<强> 第一
您正在描述一个二维数组,但在代码中使用一维数组。

<强> 第二
请记住,C阵列是 行主要订单 。提取元素的顺序必须遵循该构造。

例如,给定这个3X4阵列:( 3行,4列)

|1 1 1 1|
|2 2 2 2|
|3 3 3 3|  

包含这种矩阵的 C 变量可以定义为:

int array[3][4]={{1,1,1,1},{2,2,2,2},{3,3,3,3}};  

在内存中, 虽然它是 2维数组但元素是连续存储的(从数组[0] [0]开始)像这样:

 1 1 1 1 2 2 2 2 3 3 3 3     

从数组开头到任意一个元素 的偏移量由下式给出:

offset = row * (number_of_columns) + column;   

以相反的方式工作 ,如果您有元素的线性偏移量,则可以按如下方式获取行或列:

row = offset/(number_of_columns);  
column = offset%(number_of_columns);

在您显示的示例数据中(在您编辑原始帖子之前),第1行包含4个1,&amp; 4 2s,然后第2行:4 3s&amp; 4 4s,依此类推。在提取时,在遍历列以获取第一个块时,必须将for循环索引设置为从4行中的每一行的0到3。然后使用4到7在相同的4行上再次遍历列以获得第二个块。

对于8x8,将使用相同的程序。请记住数组的 行主要订单

获取8x8的第一个块

int i, j, r=8, c=8;
                  //first row                       2nd   3rd    and so on
int array[8][8]={{1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4},{...},{...}, (8 blocks total)...}; 

for(i=0;i<r/2;i++) //traverse 4 of 8 rows
   for(j=0;c/2<j++) //traverse 4 of 8 columns
      printf(" %d ", array[i][j]);  //note this array is a two dimensional array,   
                                    //while you are showing a 1 dimensional array in your example  
                                    //(this is only 1 dimensional:  array[i*4 + j])  

相应地更改剩余块的索引

答案 2 :(得分:0)

您似乎将所谓的矩阵存储为一个数组,而不是矩阵。矩阵是 一系列数组,这就是让你感到困难的原因。

for (p = 0; p < nr_blocks; p ++) { 
    for (i = p*4; i < p*4 + 8; i=i+2) {
        for (j = 0; j < 4; j++) {
            printf(" %d ", array[i*4 + j]);
        }
    }
}