给定一个大小为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个街区。
出了什么问题?
答案 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]);
}
}
}