C语言如何将大尺寸二维数组拆分为多个等规格小二维数组
二维数组分块拆分实现方法
你可以新增两层循环遍历每个分块的起始偏移位置,即可获取所有象限的内容,该逻辑也可以直接适配更大尺寸的数组拆分场景。
核心思路
先定义四个通用参数,适配所有可整除的拆分需求:
- 原数组行数:
ORIG_ROW,4x4场景下为4,28x28场景下为28 - 原数组列数:
ORIG_COL,4x4场景下为4,28x28场景下为28 - 拆分后小分块行数:
BLOCK_ROW,2x2场景下为2,14x14场景下为14 - 拆分后小分块列数:
BLOCK_COL,2x2场景下为2,14x14场景下为14
行方向总分块数为 ORIG_ROW / BLOCK_ROW,列方向总分块数为 ORIG_COL / BLOCK_COL,四层循环嵌套即可完成遍历:
- 第一层循环:遍历行方向的所有分块
- 第二层循环:遍历列方向的所有分块
- 第三层循环:遍历当前分块内的行元素
- 第四层循环:遍历当前分块内的列元素
4x4数组拆2x2分块代码示例
#include <stdio.h> #define ORIG_ROW 4 #define ORIG_COL 4 #define BLOCK_ROW 2 #define BLOCK_COL 2 int main() { int disp[ORIG_ROW][ORIG_COL] = {{12,4,32,9}, {19,24,3,4},{1,26,3,8},{3,24,7,5}}; // 外层两层循环遍历所有分块 for(int block_r = 0; block_r < ORIG_ROW / BLOCK_ROW; block_r++) { for(int block_c = 0; block_c < ORIG_COL / BLOCK_COL; block_c++) { printf("第%d行第%d列的分块内容:\n", block_r + 1, block_c + 1); // 内层两层循环遍历分块内元素 for(int i = 0; i < BLOCK_ROW; i++) { for(int j = 0; j < BLOCK_COL; j++) { // 计算实际访问的原数组下标 int real_r = block_r * BLOCK_ROW + i; int real_c = block_c * BLOCK_COL + j; printf("%d ", disp[real_r][real_c]); } printf("\n"); } printf("---------------\n"); } } return 0; }
运行上述代码会依次输出4个2x2分块的全部内容,包含你需要的另外三个象限的元素。
大尺寸数组适配
如果是28x28数组拆分为14x14数组的场景,仅需要修改开头的宏定义即可,不需要调整循环逻辑:
#define ORIG_ROW 28 #define ORIG_COL 28 #define BLOCK_ROW 14 #define BLOCK_COL 14
如果原数组尺寸不是分块尺寸的整数倍,可以按需对原数组边缘补零、或者直接舍弃不满足尺寸的边缘部分即可
内容的提问来源于stack exchange,提问作者user14997606
相关产品推荐
相关产品推荐

