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
相关产品推荐
相关产品推荐

