如何在C语言中将二维矩阵mat[h][w]拆分为5行2列的块?
矩阵分块实现:拆分5行2列的子块
以h=15、w=8的矩阵为例,原矩阵刚好是5行的3倍、2列的4倍,可拆分为3×4=12个5×2的子块。以下是具体实现方案:
核心逻辑
- 计算分块数量:行方向分为
h // 5个块,列方向分为w // 2个块 - 嵌套遍历行块和列块的起始位置,逐块提取对应区域的子矩阵
实现代码
方案1:用NumPy快速分块(推荐)
NumPy内置的split方法可以高效完成矩阵分块:
import numpy as np # 构造15×8的示例矩阵 mat = np.arange(15*8).reshape(15, 8) # 先按行分割为3个5×8的行块,再将每个行块按列分割为4个5×2的子块 row_split = np.split(mat, mat.shape[0] // 5, axis=0) all_blocks = [col_block for row_block in row_split for col_block in np.split(row_block, row_block.shape[1] // 2, axis=1)] # 验证子块形状 print(all_blocks[0].shape) # 输出 (5, 2)
方案2:原生Python列表实现
如果不用第三方库,可通过列表切片手动提取:
# 构造15×8的示例矩阵 mat = [[i*8 + j for j in range(8)] for i in range(15)] row_block_count = len(mat) // 5 col_block_count = len(mat[0]) // 2 all_blocks = [] # 遍历每个行块 for row_start in range(0, len(mat), 5): row_slice = mat[row_start : row_start+5] # 遍历每个列块 for col_start in range(0, len(mat[0]), 2): # 提取5行2列的子块 block = [row[col_start : col_start+2] for row in row_slice] all_blocks.append(block) # 打印第一个子块 print(all_blocks[0])
边界情况处理
如果原矩阵的行数h不是5的倍数,或列数w不是2的倍数:
- 可选方案1:仅处理前
(h//5)*5行和(w//2)*2列,丢弃剩余行/列 - 可选方案2:对剩余的行/列补零,使其满足5行或2列的要求,再进行分块
内容的提问来源于stack exchange,提问作者Diana Freixo
相关产品推荐
相关产品推荐

