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

C语言中如何从方阵提取右下角子矩阵及所有可能子矩阵?

在C语言中提取方阵的子矩阵(含右下角及所有可能子矩阵)

你找到的代码问题在于固定从原矩阵的(0,0)位置开始复制,因此只能获取左上角子矩阵。要提取任意位置(包括右下角)的子矩阵,核心是先确定子矩阵在原矩阵中的起始坐标,再通过嵌套循环完成元素复制。

1. 提取指定位置的子矩阵(以右下角为例)

对于R×R的方阵,若要提取r×r的右下角子矩阵,起始行和起始列的坐标均为R - r(方阵行列数一致)。

示例代码:

#include <stdio.h>

#define R 3  // 原方阵行数/列数
#define r 2  // 子矩阵行数/列数

int main() {
    int initial_matrix[R][R] = {{1,2,3}, {4,5,6}, {7,8,9}};
    int submatrix[r][r];
    
    // 右下角子矩阵的起始坐标
    int start_row = R - r;
    int start_col = R - r;
    
    // 复制子矩阵元素
    for (int i = 0; i < r; i++) {
        for (int j = 0; j < r; j++) {
            submatrix[i][j] = initial_matrix[start_row + i][start_col + j];
        }
    }
    
    // 打印验证
    printf("右下角子矩阵:\n");
    for (int i = 0; i < r; i++) {
        for (int j = 0; j < r; j++) {
            printf("%d ", submatrix[i][j]);
        }
        printf("\n");
    }
    return 0;
}

运行输出:

右下角子矩阵:
5 6
8 9

2. 遍历提取所有可能的子矩阵

对于R×R的方阵,r×r子矩阵的起始行/列坐标范围是0到R - r(包含两端)。通过嵌套循环遍历所有起始位置,即可逐个提取所有子矩阵。

示例代码:

#include <stdio.h>

#define R 3  // 原方阵行数/列数
#define r 2  // 子矩阵行数/列数

int main() {
    int initial_matrix[R][R] = {{1,2,3}, {4,5,6}, {7,8,9}};
    int submatrix[r][r];
    
    // 遍历所有可能的起始位置
    for (int start_row = 0; start_row <= R - r; start_row++) {
        for (int start_col = 0; start_col <= R - r; start_col++) {
            // 复制当前起始位置的子矩阵
            for (int i = 0; i < r; i++) {
                for (int j = 0; j < r; j++) {
                    submatrix[i][j] = initial_matrix[start_row + i][start_col + j];
                }
            }
            
            // 打印当前子矩阵
            printf("起始位置(%d,%d)的子矩阵:\n", start_row, start_col);
            for (int i = 0; i < r; i++) {
                for (int j = 0; j < r; j++) {
                    printf("%d ", submatrix[i][j]);
                }
                printf("\n");
            }
            printf("\n");
        }
    }
    return 0;
}

运行输出所有4个2×2子矩阵:

起始位置(0,0)的子矩阵:
1 2
4 5

起始位置(0,1)的子矩阵:
2 3
5 6

起始位置(1,0)的子矩阵:
4 5
7 8

起始位置(1,1)的子矩阵:
5 6
8 9

关键说明

  • 调整start_row和start_col的值,即可提取原矩阵中任意位置的子矩阵。
  • 遍历起始位置时,循环条件设为start_row <= R - r(列同理),能确保子矩阵不会超出原矩阵边界。

内容的提问来源于stack exchange,提问作者lucien77

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 17:55:25