如何在C语言中实现删除用户指定行/列的矩阵子矩阵功能
实现
subMatrix函数的思路与代码示例 嘿,你遇到的这个问题完全可以用嵌套循环解决,核心是先标记要删除的行和列,再通过双计数器来映射原矩阵到新矩阵的位置。我给你一步步拆解:
第一步:先标记要删除的行和列
首先,你需要把用户输入的要删除的行/列号(注意是1-based的,比如用户输入的行1对应数组索引0)转换成标记数组,方便后续快速判断是否跳过。比如用两个数组来记录哪些行/列要删除:
// 假设用户输入的要删除的行存在数组del_rows里,长度为del_row_count int delete_rows[10] = {0}; // 0表示保留,1表示删除 for (int i = 0; i < del_row_count; i++) { // 转成0基索引 delete_rows[del_rows[i] - 1] = 1; } // 同理处理列 int delete_cols[10] = {0}; for (int i = 0; i < del_col_count; i++) { delete_cols[del_cols[i] - 1] = 1; }
第二步:计算新矩阵的维度
新矩阵的行数 = 原矩阵行数 - 要删除的行数,列数同理:
m2->nrows = m1.nrows - del_row_count; m2->ncols = m1.ncols - del_col_count;
第三步:嵌套循环生成子矩阵
用两个计数器new_row和new_col来跟踪新矩阵的当前填充位置,遍历原矩阵的每一行每一列,跳过标记为删除的行/列:
int new_row = 0; for (int i = 0; i < m1.nrows; i++) { // 如果当前行要删除,直接跳过 if (delete_rows[i] == 1) { continue; } int new_col = 0; for (int j = 0; j < m1.ncols; j++) { // 如果当前列要删除,直接跳过 if (delete_cols[j] == 1) { continue; } // 赋值到新矩阵 m2->mValues[new_row][new_col] = m1.mValues[i][j]; new_col++; } new_row++; }
额外注意点
- 记得先处理用户输入的行/列号,把它们存储到临时数组(比如
del_rows、del_cols)里,再生成标记数组。 - 要确保用户输入的行/列号在合法范围内(比如不能大于原矩阵的行数/列数),可以加输入校验避免越界。
优化提问质量的小建议
- 可以附上你当前尝试的
subMatrix代码片段,说明你在哪个环节卡壳(比如计数器混乱、赋值错误),这样别人能更快定位问题。 - 给出一个具体的测试用例:比如原矩阵的具体数据,用户输入的删除行/列,以及你期望得到的子矩阵结果,这样验证方案更直观。
- 说明你是否已经处理了用户输入的部分(比如是否已经把要删除的行/列存储到数组里),避免重复讨论输入逻辑。
内容的提问来源于stack exchange,提问作者8TrackRobot
相关产品推荐
相关产品推荐

