You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C语言中将二维矩阵mat[h][w]拆分为5行2列的块?

矩阵分块实现:拆分5行2列的子块

以h=15、w=8的矩阵为例,原矩阵刚好是5行的3倍、2列的4倍,可拆分为3×4=12个5×2的子块。以下是具体实现方案:

核心逻辑

  1. 计算分块数量:行方向分为 h // 5 个块,列方向分为 w // 2 个块
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 11:03:32